| 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);
|
|
|