/// <summary> /// Loads the info of the assembly from the AssemblyInfo.cs file. /// </summary> /// <param name="reader">TextReader of the <c>AssemblyInfo.cs</c> formatted file.</param> /// <param name="todoList">Class responsible for to-do storage</param> /// <returns>The <see cref="IInfoProcessor"/> instance where the loaded information is stored.</returns> public override IInfoProcessor LoadAssemblyInfo(TextReader reader, ITodoList todoList) { using (reader) { int lineNumber = 0; bool versionLoaded = false; bool todoLoaded = false; bool todoLoading = false; while (true) { string line = reader.ReadLine(); lineNumber++; if (line == null) { if (!versionLoaded) { throw new FileFormatException("Does not contain a readable version"); } else { break; } } line = line.Trim(); if (line == string.Empty) { continue; } if (line.StartsWith(TodoParam)) { string[] elems = line.Substring(TodoParam.Length).Trim().Split('='); if (elems.Length != 2) { throw new FileFormatException("Wrong param line format: line " + lineNumber); } ProgramProperty.Set(elems[0], elems[1]); continue; } if (line.StartsWith(StartOfTodoSignature)) { if (todoLoaded) { throw new FileFormatException("More than a todo zone: line" + lineNumber); } if (todoLoading) { throw new FileFormatException("More than a todo zone: line" + lineNumber); } todoLoading = true; continue; } if (todoLoading && line.StartsWith(StartOfTodoFollowing)) { if (line.StartsWith(StartOfTodoContent)) { bool done = line[StartOfTodoContent.Length] != ' '; int startOfContent = line.IndexOf(']'); if (startOfContent < 0) { throw new FileFormatException("Error in todo line: line" + lineNumber); } if (todoList != null) { todoList.AddTodo(done, line.Substring(startOfContent + 1).TrimStart()); } } else { if (todoList != null) { todoList.AppendLineTodo(line.Substring(StartOfTodoFollowing.Length).TrimStart()); } } continue; } if (todoLoading && line.StartsWith(EndOfTodos)) { todoLoading = false; todoLoaded = true; continue; } if (line.StartsWith(AssemblyVersionSignature)) { if (!versionLoaded) { string versioString = line.Substring( AssemblyVersionSignature.Length + 1, line.IndexOf('"', AssemblyVersionSignature.Length + 1) - AssemblyVersionSignature.Length - 1); this.CurrentVersion = new AssemblyVersion(versioString); } else { throw new FileFormatException("Contains more than one readable version"); } versionLoaded = true; } else { if (line.StartsWith(AssemblyFileVersionSignature)) { continue; } if (versionLoaded) { if (this.lastComments.Count < MaxComments) { this.lastComments.Add(line); } else { break; } } } } } return(this); }
public override IInfoProcessor LoadAssemblyInfo(TextReader reader, ITodoList todoList) { bool versionLoaded = false; bool todoLoaded = false; bool todoLoading = false; using (reader) { int lineNumber = 0; while (true) { string line = reader.ReadLine(); lineNumber++; if (line == null) { if (!versionLoaded) { throw new FileFormatException("Does not contain a readable version"); } else { break; } } line = line.Trim(); if (line == string.Empty) { continue; } if (line.StartsWith(TodoParam)) { string[] elems = line.Substring(TodoParam.Length).Trim().Split('='); if (elems.Length != 2) { throw new FileFormatException("Wrong param line format: line " + lineNumber); } ProgramProperty.Set(elems[0], elems[1]); continue; } if (line.StartsWith(StartOfTodoSignature)) { if (todoLoaded) { throw new FileFormatException("More than a todo zone: line" + lineNumber); } if (todoLoading) { throw new FileFormatException("More than a todo zone: line" + lineNumber); } todoLoading = true; continue; } if (todoLoading && line.StartsWith(StartOfTodoFollowing)) { if (line.StartsWith(StartOfTodoContent)) { bool done = line[StartOfTodoContent.Length] != ' '; int startOfContent = line.IndexOf(']'); if (startOfContent < 0) { throw new FileFormatException("Error in todo line: line" + lineNumber); } if (todoList != null) { todoList.AddTodo(done, line.Substring(startOfContent + 1).TrimStart()); } } else { if (todoList != null) { todoList.AppendLineTodo(line.Substring(StartOfTodoFollowing.Length).TrimStart()); } } continue; } if (todoLoading && line.StartsWith(EndOfTodos)) { todoLoading = false; todoLoaded = true; continue; } if (line.StartsWith(AssemblyVersionSignature)) { if (!versionLoaded) { int firstAssignment = line.IndexOf(":="); if (firstAssignment < 0) { throw new FileFormatException("The version format is wrong"); } int secondAssignment = line.IndexOf(":=", firstAssignment + 2); if (secondAssignment < 0) { throw new FileFormatException("The version format is wrong"); } /// Here we get the version in numeral format in what is between first assignment and the first ; StringBuilder versionString = new StringBuilder(); for (int i = firstAssignment; i < secondAssignment; i++) { char c = line[i]; if (c == ';') { break; } if (c == '.' || Char.IsDigit(c)) { versionString.Append(c); } } versionString.Append('.'); for (int i = secondAssignment; i < line.Length; i++) { char c = line[i]; if (c == ';') { break; } if (c == '.' || Char.IsDigit(c)) { versionString.Append(c); } } this.CurrentVersion = new AssemblyVersion(versionString.ToString()); } else { throw new FileFormatException("Contains more than one readable version"); } versionLoaded = true; } else { if (versionLoaded) { if (this.lastComments.Count < MaxComments) { this.lastComments.Add(line); } else { break; } } } } return(this); } }