| 1136 | } |
| 1137 | |
| 1138 | SideBySideDiffOutput GitDiffWorker::diffOutput(const DiffEditorInput &input) |
| 1139 | { |
| 1140 | SideBySideDiffOutput output; |
| 1141 | |
| 1142 | const QChar separator = '\n'; |
| 1143 | int blockNumber = 0; |
| 1144 | std::array<QString, SideCount> diffText {}; |
| 1145 | |
| 1146 | auto addFileLine = [&](DiffSide side, const FileData &fileData) { |
| 1147 | output.side[side].selections[blockNumber].append({ input.fileLineFormat }); |
| 1148 | output.side[side].diffData.setFileInfo(blockNumber, fileData.fileInfo[side]); |
| 1149 | diffText[side] += separator; |
| 1150 | }; |
| 1151 | |
| 1152 | auto addChunkLine = [&](DiffSide side, int skippedLines, const QString &contextInfo = {}) { |
| 1153 | output.side[side].selections[blockNumber].append({ input.chunkLineFormat }); |
| 1154 | output.side[side].diffData.setSkippedLines(blockNumber, skippedLines, contextInfo); |
| 1155 | diffText[side] += separator; |
| 1156 | }; |
| 1157 | |
| 1158 | auto addRowLine = [&](DiffSide side, const RowData &rowData, |
| 1159 | int *lineNumber, int *lastLineNumber = nullptr) { |
| 1160 | if (rowData.line[side].textLineType == TextLineData::TextLine) { |
| 1161 | diffText[side] += rowData.line[side].text; |
| 1162 | if (lastLineNumber) |
| 1163 | *lastLineNumber = *lineNumber; |
| 1164 | ++(*lineNumber); |
| 1165 | output.side[side].diffData.setLineNumber(blockNumber, *lineNumber); |
| 1166 | } else if (rowData.line[side].textLineType == TextLineData::Separator) { |
| 1167 | output.side[side].diffData.setSeparator(blockNumber, true); |
| 1168 | } |
| 1169 | |
| 1170 | if (!rowData.equal) { |
| 1171 | if (rowData.line[side].textLineType == TextLineData::TextLine) |
| 1172 | output.side[side].selections[blockNumber].append({ input.lineFormat[side] }); |
| 1173 | else |
| 1174 | output.side[side].selections[blockNumber].append({ input.spanLineFormat }); |
| 1175 | } |
| 1176 | for (auto it = rowData.line[side].changedPositions.cbegin(), |
| 1177 | end = rowData.line[side].changedPositions.cend(); |
| 1178 | it != end; ++it) { |
| 1179 | output.side[side].selections[blockNumber].append( |
| 1180 | { input.charFormat[side], it.key(), it.value() }); |
| 1181 | } |
| 1182 | diffText[side] += separator; |
| 1183 | }; |
| 1184 | |
| 1185 | auto addSkippedLine = [&](DiffSide side, int skippedLines) { |
| 1186 | output.side[side].selections[blockNumber].append({ input.chunkLineFormat }); |
| 1187 | output.side[side].diffData.setSkippedLines(blockNumber, skippedLines); |
| 1188 | diffText[side] += separator; |
| 1189 | }; |
| 1190 | |
| 1191 | for (const FileData &contextFileData : input.contextFileData) { |
| 1192 | diffText = {}; |
| 1193 | output.foldingIndent.insert(blockNumber, 1); |
| 1194 | |
| 1195 | addFileLine(LeftSide, contextFileData); |
nothing calls this directly
no test coverage detected