async void _btnAnalysis_OnClick(object sender, RoutedEventArgs args) { if (!DataIsLoaded) { return; } await BlockInputAction(() => { try { _analysisDone = false; _oldXmlDocDict.Clear(); Log("---------------- Анализ входных данных:\n{0}\n{1}\n{2}\n----------------", _resourcesFile, _csvDocFile, _solutionFile); var allFound = true; foreach (var kv in _newXmlDocDict) { var symbolId = kv.Key; var newXmlDoc = kv.Value; if (!newXmlDoc.CheckResources(_resourcesDict)) { continue; } var oldXmlDoc = _solution.GetXmlDocForSymbol(symbolId); if (oldXmlDoc == null) { allFound = false; continue; } if (!CodeXmlDoc.IsDocStructureTheSame(oldXmlDoc, newXmlDoc)) { Log("ERROR: Структура документации в существующем коде и во входном файле не совпадают для символа {0}", symbolId); continue; } _oldXmlDocDict[symbolId] = oldXmlDoc; } Log("------------------------------------------------------------------------"); _analysisDone = _newXmlDocDict.Count > 0 && _oldXmlDocDict.Count > 0; Log("Анализ завершен. " + (_analysisDone ? "Можно выполнять замену в коде." : "Нет ни одного символа для замены документации.")); var skipSymbols = _newXmlDocDict.Keys.Except(_oldXmlDocDict.Keys).ToArray(); if (skipSymbols.Length > 0) { Log("Следующие символы проигнорированы:\n{0}", string.Join("\n", skipSymbols)); } } catch (Exception e) { ErrorMsg("Ошибка во время анализа: " + e); } return(Task.FromResult(0)); }); }
public CodeXmlDoc GetXmlDocForSymbol(string symbolId) { ISymbol symbol; if (!_symbols.TryGetValue(symbolId, out symbol)) { MainWindow.Instance.Log("ERROR: в загруженном решении символ не обнаружен: {0}", symbolId); return(null); } var xmlStr = symbol.GetDocumentationCommentXml(); if (string.IsNullOrEmpty(xmlStr)) { var err = string.Format("ERROR: существующая xml документация для символа не найдена: {0}", symbolId); MainWindow.Instance.Log(err); return(null); } var doc = new CodeXmlDoc(symbolId); try { doc.ParseFromXml(xmlStr); } catch (Exception e) { MainWindow.Instance.Log("ERROR: Не удалось распарсить xml документацию для символа {0}:\n{1}", symbolId, e); return(null); } return(doc); }
async void SelectDocCsv_Click(object sender, RoutedEventArgs e) { var filePath = SelectCsvFile(_tbDocDsvText.Text, "Выбор CSV файла со структурой XML документации", "CSV files (*.csv)|*.csv"); if (string.IsNullOrEmpty(filePath)) { return; } _csvDocFile = null; _analysisDone = false; _tbDocDsvText.Text = filePath; _newXmlDocDict.Clear(); await BlockInputAction(() => { var csv = ReadCsvFile(filePath, 2); foreach (var arr in csv) { var docPartId = arr[0].Trim(); var slashIndex = docPartId.IndexOf('/'); if (slashIndex < 0) { Log("WARNING: в строке отсутствует символ /: {0}", docPartId); continue; } var symbolId = docPartId.Substring(0, slashIndex); var xmlPath = docPartId.Substring(slashIndex); CodeXmlDoc doc; if (!_newXmlDocDict.TryGetValue(symbolId, out doc)) { _newXmlDocDict.Add(symbolId, doc = new CodeXmlDoc(symbolId)); } doc.AddDocPart(xmlPath, arr[1].Trim()); } if (_newXmlDocDict.Count > 0) { _csvDocFile = filePath; } return(Task.FromResult(0)); }, "Загрузка CSV файла со структурой XML документации"); //var paths = string.Join("\n", _newXmlDocDict.Keys.Select(k => k.Substring(k.IndexOf('/'))).Distinct()); //File.WriteAllText("paths.txt", paths); //MessageBox.Show(this, "paths:\n" + , "paths"); }
public static bool IsDocStructureTheSame(CodeXmlDoc doc1, CodeXmlDoc doc2) { return doc1._docParts.Count == doc2._docParts.Count && doc1._docParts.Keys.All(k => doc2._docParts.ContainsKey(k)); }
async private void DoDocCsv(string filePath) { _csvDocFile = null; _analysisDone = false; _tbDocDsvText.Text = filePath; _newXmlDocDict.Clear(); await BlockInputAction(() => { var csv = ReadCsvFile(filePath, 2); foreach (var arr in csv) { var docPartId = arr[0].Trim(); var slashIndex = docPartId.IndexOf('/'); if (slashIndex < 0) { Log("WARNING: в строке отсутствует символ /: {0}", docPartId); continue; } var symbolId = docPartId.Substring(0, slashIndex); var xmlPath = docPartId.Substring(slashIndex); CodeXmlDoc doc; if (!_newXmlDocDict.TryGetValue(symbolId, out doc)) _newXmlDocDict.Add(symbolId, doc = new CodeXmlDoc(symbolId)); doc.AddDocPart(xmlPath, arr[1].Trim()); } if (_newXmlDocDict.Count > 0) _csvDocFile = filePath; return Task.FromResult(0); }, "Загрузка CSV файла со структурой XML документации"); //var paths = string.Join("\n", _newXmlDocDict.Keys.Select(k => k.Substring(k.IndexOf('/'))).Distinct()); //File.WriteAllText("paths.txt", paths); //MessageBox.Show(this, "paths:\n" + , "paths"); }
public CodeXmlDoc GetXmlDocForSymbol(string symbolId) { ISymbol symbol; if(!_symbols.TryGetValue(symbolId, out symbol)) { MainWindow.Instance.Log("ERROR: в загруженном решении символ не обнаружен: {0}", symbolId); return null; } var xmlStr = symbol.GetDocumentationCommentXml(); if(string.IsNullOrEmpty(xmlStr)) { var err = string.Format("ERROR: существующая xml документация для символа не найдена: {0}", symbolId); MainWindow.Instance.Log(err); return null; } var doc = new CodeXmlDoc(symbolId); try { doc.ParseFromXml(xmlStr); } catch(Exception e) { MainWindow.Instance.Log("ERROR: Не удалось распарсить xml документацию для символа {0}:\n{1}", symbolId, e); return null; } return doc; }
public static bool IsDocStructureTheSame(CodeXmlDoc doc1, CodeXmlDoc doc2) { return(doc1._docParts.Count == doc2._docParts.Count && doc1._docParts.Keys.All(k => doc2._docParts.ContainsKey(k))); }