/// <summary>Reads a "hints" element, consuming the element.</summary> /// <exception cref="XmlException">Thrown when the Android Studio file is incorrect.</exception> /// <param name="reader">The reader from which the hints shall be parsed.</param> /// <param name="strings">NameTable strings used to parse Android Studio files.</param> /// <returns>The set of hint values from <paramref name="reader"/>.</returns> public static ImmutableArray <string> ReadHints(XmlReader reader, AndroidStudioStrings strings) { Debug.Assert(Ref.Equal(reader.LocalName, strings.Hints), "ReadHints didn't have hints"); var result = ImmutableArray.CreateBuilder <string>(); if (!reader.IsEmptyElement) { int hintsDepth = reader.Depth; reader.Read(); // Consume start element while (reader.Depth > hintsDepth) { if (!Ref.Equal(reader.LocalName, strings.Hint)) { throw reader.CreateException(ConverterResources.AndroidStudioHintsElementContainedNonHint); } string hintContent = reader.GetAttribute(strings.Value); if (hintContent == null) { throw reader.CreateException(ConverterResources.AndroidStudioHintElementMissingValue); } if (hintContent.Length != 0) { result.Add(hintContent); } reader.Skip(); } } reader.Read(); // Consume the end / empty element return(result.ToImmutable()); }
// These functions take ref Builder to avoid boxing Builder private static void ReadEntryPointElement(ref Builder b, XmlReader reader, AndroidStudioStrings strings) { while (reader.MoveToNextAttribute()) { string name = reader.LocalName; if (Ref.Equal(name, strings.Type)) { b.EntryPointType = reader.Value; } else if (Ref.Equal(name, strings.FQName)) { b.EntryPointName = reader.Value; } } reader.Skip(); }
private static void ReadProblemClassElement(ref Builder b, XmlReader reader, AndroidStudioStrings strings) { while (reader.MoveToNextAttribute()) { string name = reader.LocalName; if (Ref.Equal(name, strings.Severity)) { b.Severity = reader.Value; } else if (Ref.Equal(name, strings.AttributeKey)) { b.AttributeKey = reader.Value; } } reader.MoveToElement(); b.ProblemClass = reader.ReadElementContentAsString(); }
public void AndroidStudioStrings_AddsToNameTable() { var nameTable = new NameTable(); var uut = new AndroidStudioStrings(nameTable); Assert.Same(nameTable.Add("problems"), uut.Problems); Assert.Same(nameTable.Add("problem"), uut.Problem); Assert.Same(nameTable.Add("file"), uut.File); Assert.Same(nameTable.Add("line"), uut.Line); Assert.Same(nameTable.Add("module"), uut.Module); Assert.Same(nameTable.Add("package"), uut.Package); Assert.Same(nameTable.Add("entry_point"), uut.EntryPoint); Assert.Same(nameTable.Add("problem_class"), uut.ProblemClass); Assert.Same(nameTable.Add("hints"), uut.Hints); Assert.Same(nameTable.Add("hint"), uut.Hint); Assert.Same(nameTable.Add("description"), uut.Description); Assert.Same(nameTable.Add("TYPE"), uut.Type); Assert.Same(nameTable.Add("FQNAME"), uut.FQName); Assert.Same(nameTable.Add("severity"), uut.Severity); Assert.Same(nameTable.Add("attribute_key"), uut.AttributeKey); Assert.Same(nameTable.Add("value"), uut.Value); }
public void AndroidStudioStrings_AddsToNameTable() { var nameTable = new NameTable(); var uut = new AndroidStudioStrings(nameTable); Assert.AreSame(nameTable.Add("problems"), uut.Problems); Assert.AreSame(nameTable.Add("problem"), uut.Problem); Assert.AreSame(nameTable.Add("file"), uut.File); Assert.AreSame(nameTable.Add("line"), uut.Line); Assert.AreSame(nameTable.Add("module"), uut.Module); Assert.AreSame(nameTable.Add("package"), uut.Package); Assert.AreSame(nameTable.Add("entry_point"), uut.EntryPoint); Assert.AreSame(nameTable.Add("problem_class"), uut.ProblemClass); Assert.AreSame(nameTable.Add("hints"), uut.Hints); Assert.AreSame(nameTable.Add("hint"), uut.Hint); Assert.AreSame(nameTable.Add("description"), uut.Description); Assert.AreSame(nameTable.Add("TYPE"), uut.Type); Assert.AreSame(nameTable.Add("FQNAME"), uut.FQName); Assert.AreSame(nameTable.Add("severity"), uut.Severity); Assert.AreSame(nameTable.Add("attribute_key"), uut.AttributeKey); Assert.AreSame(nameTable.Add("value"), uut.Value); }
/// <summary>Parses a "problem" node from an Android Studio log and consumes that node.</summary> /// <exception cref="XmlException">Thrown when the Android Studio file is incorrect.</exception> /// <param name="reader">The reader from which the problem shall be parsed.</param> /// <param name="strings">NameTable strings used to parse Android Studio files.</param> /// <returns> /// If the problem node is not empty, an instance of <see cref="AndroidStudioProblem" />; /// otherwise, null. /// </returns> public static AndroidStudioProblem Parse(XmlReader reader, AndroidStudioStrings strings) { if (!reader.IsStartElement(strings.Problem)) { throw reader.CreateException(ConverterResources.AndroidStudioNotProblemElement); } Builder b = new Builder(); if (!reader.IsEmptyElement) { int problemDepth = reader.Depth; reader.Read(); // Get to children while (reader.Depth > problemDepth) { string nodeName = reader.LocalName; if (Ref.Equal(nodeName, strings.File)) { b.File = reader.ReadElementContentAsString(); } else if (Ref.Equal(nodeName, strings.Line)) { b.Line = Math.Max(1, reader.ReadElementContentAsInt()); } else if (Ref.Equal(nodeName, strings.Module)) { b.Module = reader.ReadElementContentAsString(); } else if (Ref.Equal(nodeName, strings.Package)) { b.Package = reader.ReadElementContentAsString(); } else if (Ref.Equal(nodeName, strings.EntryPoint)) { ReadEntryPointElement(ref b, reader, strings); } else if (Ref.Equal(nodeName, strings.ProblemClass)) { ReadProblemClassElement(ref b, reader, strings); } else if (Ref.Equal(nodeName, strings.Hints)) { b.Hints = ReadHints(reader, strings); } else if (Ref.Equal(nodeName, strings.Description)) { b.Description = reader.ReadElementContentAsString(); } else { reader.Skip(); } } } reader.Read(); // Consume the empty / end element if (b.IsEmpty) { return(null); } try { return(new AndroidStudioProblem(b)); } catch (ArgumentException invalidData) { throw reader.CreateException(invalidData.Message); } }
/// <summary> /// Initializes a new instance of the <see cref="AndroidStudioConverter"/> class. /// </summary> public AndroidStudioConverter() { _nameTable = new NameTable(); _strings = new AndroidStudioStrings(_nameTable); }
/// <summary>Reads a "hints" element, consuming the element.</summary> /// <exception cref="XmlException">Thrown when the Android Studio file is incorrect.</exception> /// <param name="reader">The reader from which the hints shall be parsed.</param> /// <param name="strings">NameTable strings used to parse Android Studio files.</param> /// <returns>The set of hint values from <paramref name="reader"/>.</returns> public static ImmutableArray<string> ReadHints(XmlReader reader, AndroidStudioStrings strings) { Debug.Assert(Ref.Equal(reader.LocalName, strings.Hints), "ReadHints didn't have hints"); var result = ImmutableArray.CreateBuilder<string>(); if (!reader.IsEmptyElement) { int hintsDepth = reader.Depth; reader.Read(); // Consume start element while (reader.Depth > hintsDepth) { if (!Ref.Equal(reader.LocalName, strings.Hint)) { throw reader.CreateException(ConverterResources.AndroidStudioHintsElementContainedNonHint); } string hintContent = reader.GetAttribute(strings.Value); if (hintContent == null) { throw reader.CreateException(ConverterResources.AndroidStudioHintElementMissingValue); } if (hintContent.Length != 0) { result.Add(hintContent); } reader.Skip(); } } reader.Read(); // Consume the end / empty element return result.ToImmutable(); }
/// <summary>Parses a "problem" node from an Android Studio log and consumes that node.</summary> /// <exception cref="XmlException">Thrown when the Android Studio file is incorrect.</exception> /// <param name="reader">The reader from which the problem shall be parsed.</param> /// <param name="strings">NameTable strings used to parse Android Studio files.</param> /// <returns> /// If the problem node is not empty, an instance of <see cref="AndroidStudioProblem" />; /// otherwise, null. /// </returns> public static AndroidStudioProblem Parse(XmlReader reader, AndroidStudioStrings strings) { if (!reader.IsStartElement(strings.Problem)) { throw reader.CreateException(ConverterResources.AndroidStudioNotProblemElement); } Builder b = new Builder(); if (!reader.IsEmptyElement) { int problemDepth = reader.Depth; reader.Read(); // Get to children while (reader.Depth > problemDepth) { string nodeName = reader.LocalName; if (Ref.Equal(nodeName, strings.File)) { b.File = reader.ReadElementContentAsString(); } else if (Ref.Equal(nodeName, strings.Line)) { b.Line = Math.Max(1, reader.ReadElementContentAsInt()); } else if (Ref.Equal(nodeName, strings.Module)) { b.Module = reader.ReadElementContentAsString(); } else if (Ref.Equal(nodeName, strings.Package)) { b.Package = reader.ReadElementContentAsString(); } else if (Ref.Equal(nodeName, strings.EntryPoint)) { ReadEntryPointElement(ref b, reader, strings); } else if (Ref.Equal(nodeName, strings.ProblemClass)) { ReadProblemClassElement(ref b, reader, strings); } else if (Ref.Equal(nodeName, strings.Hints)) { b.Hints = ReadHints(reader, strings); } else if (Ref.Equal(nodeName, strings.Description)) { b.Description = reader.ReadElementContentAsString(); } else { reader.Skip(); } } } reader.Read(); // Consume the empty / end element if (b.IsEmpty) { return null; } try { return new AndroidStudioProblem(b); } catch (ArgumentException invalidData) { throw reader.CreateException(invalidData.Message); } }