Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3)

Unified Diff: third_party/WebKit/Source/devtools/front_end/changes/ChangesHighlighter.js

Issue 2780713005: DevTools: Add syntax highlighting to ChangesView (Closed)
Patch Set: diffRows Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | third_party/WebKit/Source/devtools/front_end/changes/ChangesView.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: third_party/WebKit/Source/devtools/front_end/changes/ChangesHighlighter.js
diff --git a/third_party/WebKit/Source/devtools/front_end/changes/ChangesHighlighter.js b/third_party/WebKit/Source/devtools/front_end/changes/ChangesHighlighter.js
index 4a7a0415f3f39e74977a2cc3bde9e332a1aed5ad..53a39c0fa735dee559fb976b5d962fe694e899ad 100644
--- a/third_party/WebKit/Source/devtools/front_end/changes/ChangesHighlighter.js
+++ b/third_party/WebKit/Source/devtools/front_end/changes/ChangesHighlighter.js
@@ -4,44 +4,123 @@
/**
* @param {!Object} config
- * @param {{rows: !Array<!Changes.ChangesView.Row>}} parserConfig
+ * @param {{diffRows: !Array<!Changes.ChangesView.Row>, baselineLines: !Array<string>, currentLines: !Array<string>, mimeType: string}} parserConfig
* @return {{
* startState: function():!Changes.ChangesHighlighter.DiffState,
- * token: function({next: function()}, !Changes.ChangesHighlighter.DiffState):string,
+ * token: function(!CodeMirror.StringStream, !Changes.ChangesHighlighter.DiffState):string,
* blankLine: function(!Changes.ChangesHighlighter.DiffState):string,
+ * copyState: function(!Changes.ChangesHighlighter.DiffState):Changes.ChangesHighlighter.DiffState
* }}
*/
Changes.ChangesHighlighter = function(config, parserConfig) {
- var rows = parserConfig.rows;
+ var diffRows = parserConfig.diffRows;
+ var baselineLines = parserConfig.baselineLines;
+ var currentLines = parserConfig.currentLines;
+ var syntaxHighlightMode = CodeMirror.getMode({}, parserConfig.mimeType);
+
+ /**
+ * @param {!Changes.ChangesHighlighter.DiffState} state
+ * @param {number} baselineLineNumber
+ * @param {number} currentLineNumber
+ */
+ function fastForward(state, baselineLineNumber, currentLineNumber) {
+ if (baselineLineNumber > state.baselineLineNumber) {
+ fastForwardSyntaxHighlighter(state.baselineSyntaxState, state.baselineLineNumber, baselineLineNumber, baselineLines);
+ state.baselineLineNumber = baselineLineNumber;
+ }
+ if (currentLineNumber > state.currentLineNumber) {
+ fastForwardSyntaxHighlighter(state.currentSyntaxState, state.currentLineNumber, currentLineNumber, currentLines);
+ state.currentLineNumber = currentLineNumber;
+ }
+ }
+
+ /**
+ * @param {!Object} syntaxState
+ * @param {number} from
+ * @param {number} to
+ * @param {!Array<string>} lines
+ */
+ function fastForwardSyntaxHighlighter(syntaxState, from, to, lines) {
+ var lineNumber = from;
+ while (lineNumber < to && lineNumber < lines.length) {
+ var stream = new CodeMirror.StringStream(lines[lineNumber]);
+ if (stream.eol() && syntaxHighlightMode.blankLine)
+ syntaxHighlightMode.blankLine(syntaxState);
+ while (!stream.eol()) {
+ syntaxHighlightMode.token(stream, syntaxState);
+ stream.start = stream.pos;
+ }
+ lineNumber++;
+ }
+ }
return {
/**
* @return {!Changes.ChangesHighlighter.DiffState}
*/
startState: function() {
- return {lineNumber: 0, index: 0};
+ return {
+ rowNumber: 0,
+ diffTokenIndex: 0,
+ currentLineNumber: 0,
+ baselineLineNumber: 0,
+ currentSyntaxState: CodeMirror.startState(syntaxHighlightMode),
+ baselineSyntaxState: CodeMirror.startState(syntaxHighlightMode),
+ syntaxPosition: 0,
+ diffPosition: 0,
+ syntaxStyle: '',
+ diffStyle: ''
+ };
},
/**
- * @param {!{next: function()}} stream
+ * @param {!CodeMirror.StringStream} stream
* @param {!Changes.ChangesHighlighter.DiffState} state
* @return {string}
*/
token: function(stream, state) {
- var row = rows[state.lineNumber];
- if (!row) {
+ var diffRow = diffRows[state.rowNumber];
+ if (!diffRow) {
stream.next();
return '';
}
+ fastForward(state, diffRow.baselineLineNumber - 1, diffRow.currentLineNumber - 1);
var classes = '';
- if (state.index === 0)
- classes += ' line-background-' + row.type + ' line-' + row.type;
- stream.pos += row.content[state.index].text.length;
- classes += ' ' + row.content[state.index].className;
- state.index++;
- if (state.index >= row.content.length) {
- state.lineNumber++;
- state.index = 0;
+ if (stream.pos === 0)
+ classes += ' line-background-' + diffRow.type + ' line-' + diffRow.type;
+
+ var syntaxHighlighterNeedsRefresh = state.diffPosition >= state.syntaxPosition;
+ if (state.diffPosition <= state.syntaxPosition) {
+ state.diffPosition += diffRow.tokens[state.diffTokenIndex].text.length;
+ state.diffStyle = diffRow.tokens[state.diffTokenIndex].className;
+ state.diffTokenIndex++;
+ }
+
+ if (syntaxHighlighterNeedsRefresh) {
+ if (diffRow.type === Changes.ChangesView.RowType.Deletion || diffRow.type === Changes.ChangesView.RowType.Addition ||
+ diffRow.type === Changes.ChangesView.RowType.Equal) {
+ state.syntaxStyle = syntaxHighlightMode.token(
+ stream, diffRow.type === Changes.ChangesView.RowType.Deletion ? state.baselineSyntaxState : state.currentSyntaxState);
+ state.syntaxPosition = stream.pos;
+ } else {
+ state.syntaxStyle = '';
+ state.syntaxPosition = Infinity;
+ }
+ }
+
+ stream.pos = Math.min(state.syntaxPosition, state.diffPosition);
+ classes += ' ' + state.syntaxStyle;
+ classes += ' ' + state.diffStyle;
+
+ if (stream.eol()) {
+ state.rowNumber++;
+ if (diffRow.type === Changes.ChangesView.RowType.Deletion)
+ state.baselineLineNumber++;
+ else
+ state.currentLineNumber++;
+ state.diffPosition = 0;
+ state.syntaxPosition = 0;
+ state.diffTokenIndex = 0;
}
return classes;
},
@@ -51,17 +130,54 @@ Changes.ChangesHighlighter = function(config, parserConfig) {
* @return {string}
*/
blankLine: function(state) {
- var row = rows[state.lineNumber];
- state.lineNumber++;
- state.index = 0;
- if (!row)
+ var diffRow = diffRows[state.rowNumber];
+ state.rowNumber++;
+ state.syntaxPosition = 0;
+ state.diffPosition = 0;
+ state.diffTokenIndex = 0;
+ if (!diffRow)
return '';
- return 'line-background-' + row.type + ' line-' + row.type;
+
+ var style = '';
+ if (syntaxHighlightMode.blankLine) {
+ if (diffRow.type === Changes.ChangesView.RowType.Equal || diffRow.type === Changes.ChangesView.RowType.Addition) {
+ style = syntaxHighlightMode.blankLine(state.currentSyntaxState);
+ state.currentLineNumber++;
+ } else if (diffRow.type === Changes.ChangesView.RowType.Deletion) {
+ style = syntaxHighlightMode.blankLine(state.baselineSyntaxState);
+ state.baselineLineNumber++;
+ }
+ }
+ return style + ' line-background-' + diffRow.type + ' line-' + diffRow.type;
+ },
+
+ /**
+ * @param {!Changes.ChangesHighlighter.DiffState} state
+ * @return {!Changes.ChangesHighlighter.DiffState}
+ */
+ copyState: function(state) {
+ var newState = Object.assign({}, state);
+ newState.currentSyntaxState = CodeMirror.copyState(syntaxHighlightMode, state.currentSyntaxState);
+ newState.baselineSyntaxState = CodeMirror.copyState(syntaxHighlightMode, state.baselineSyntaxState);
+ return /** @type {!Changes.ChangesHighlighter.DiffState} */ (newState);
}
};
};
-/** @typedef {!{lineNumber: number, index: number}} */
+/**
+ * @typedef {!{
+ * rowNumber: number,
+ * diffTokenIndex: number,
+ * currentLineNumber: number,
+ * baselineLineNumber: number,
+ * currentSyntaxState: !Object,
+ * baselineSyntaxState: !Object,
+ * syntaxPosition: number,
+ * diffPosition: number,
+ * syntaxStyle: string,
+ * diffStyle: string
+ * }}
+ */
Changes.ChangesHighlighter.DiffState;
CodeMirror.defineMode('devtools-diff', Changes.ChangesHighlighter);
« no previous file with comments | « no previous file | third_party/WebKit/Source/devtools/front_end/changes/ChangesView.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698