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

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

Issue 2780713005: DevTools: Add syntax highlighting to ChangesView (Closed)
Patch Set: 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 unified diff | 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 »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2017 The Chromium Authors. All rights reserved. 1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 /** 5 /**
6 * @param {!Object} config 6 * @param {!Object} config
7 * @param {{rows: !Array<!Changes.ChangesView.Row>}} parserConfig 7 * @param {{rows: !Array<!Changes.ChangesView.Row>, baselineLines: !Array<string >, currentLines: !Array<string>, mimeType: string}} parserConfig
8 * @return {{ 8 * @return {{
9 * startState: function():!Changes.ChangesHighlighter.DiffState, 9 * startState: function():!Changes.ChangesHighlighter.DiffState,
10 * token: function({next: function()}, !Changes.ChangesHighlighter.DiffState):s tring, 10 * token: function({next: function()}, !Changes.ChangesHighlighter.DiffState):s tring,
11 * blankLine: function(!Changes.ChangesHighlighter.DiffState):string, 11 * blankLine: function(!Changes.ChangesHighlighter.DiffState):string,
12 * copyState: function(!Changes.ChangesHighlighter.DiffState):Changes.ChangesHi ghlighter.DiffState
12 * }} 13 * }}
13 */ 14 */
14 Changes.ChangesHighlighter = function(config, parserConfig) { 15 Changes.ChangesHighlighter = function(config, parserConfig) {
15 var rows = parserConfig.rows; 16 var rows = parserConfig.rows;
17 var baselineLines = parserConfig.baselineLines;
18 var currentLines = parserConfig.currentLines;
19 var innerMode = CodeMirror.getMode({}, parserConfig.mimeType);
20
21 /**
22 * @param {!Changes.ChangesHighlighter.DiffState} state
23 * @param {number} baselineLineNumber
24 * @param {number} currentLineNumber
25 */
26 function fastForward(state, baselineLineNumber, currentLineNumber) {
27 if (baselineLineNumber > state.baselineLineNumber) {
28 fastForwardState(state.baselineState, state.baselineLineNumber, baselineLi neNumber, baselineLines);
29 state.baselineLineNumber = baselineLineNumber;
30 }
31 if (currentLineNumber > state.currentLineNumber) {
32 fastForwardState(state.currentState, state.currentLineNumber, currentLineN umber, currentLines);
33 state.currentLineNumber = currentLineNumber;
34 }
35 }
36
37 /**
38 * @param {!Object} state
39 * @param {number} from
40 * @param {number} to
41 * @param {!Array<string>} lines
42 */
43 function fastForwardState(state, from, to, lines) {
44 var lineNumber = from;
45 while (lineNumber < to && lineNumber < lines.length) {
46 var stream = new CodeMirror.StringStream(lines[lineNumber]);
47 while (!stream.eol()) {
48 innerMode.token(stream, state);
49 stream.start = stream.pos;
50 }
51 lineNumber++;
luoe 2017/03/30 01:10:39 Joel: Handle blank lines
einbinder 2017/03/30 02:22:44 Done.
52 }
53 }
16 54
17 return { 55 return {
18 /** 56 /**
19 * @return {!Changes.ChangesHighlighter.DiffState} 57 * @return {!Changes.ChangesHighlighter.DiffState}
20 */ 58 */
21 startState: function() { 59 startState: function() {
22 return {lineNumber: 0, index: 0}; 60 return {
61 lineNumber: 0,
62 index: 0,
63 currentLineNumber: 0,
64 baselineLineNumber: 0,
65 currentState: CodeMirror.startState(innerMode),
66 baselineState: CodeMirror.startState(innerMode),
67 mismatch: 0
68 };
23 }, 69 },
24 70
25 /** 71 /**
26 * @param {!{next: function()}} stream 72 * @param {!{next: function()}} stream
27 * @param {!Changes.ChangesHighlighter.DiffState} state 73 * @param {!Changes.ChangesHighlighter.DiffState} state
28 * @return {string} 74 * @return {string}
29 */ 75 */
30 token: function(stream, state) { 76 token: function(stream, state) {
31 var row = rows[state.lineNumber]; 77 var row = rows[state.lineNumber];
32 if (!row) { 78 if (!row) {
33 stream.next(); 79 stream.next();
34 return ''; 80 return '';
35 } 81 }
82 fastForward(state, row.baselineLineNumber - 1, row.currentLineNumber - 1);
luoe 2017/03/30 01:10:39 Joel: 0 indexed
einbinder 2017/03/30 02:22:43 I misread, it is good the way it is.
36 var classes = ''; 83 var classes = '';
37 if (state.index === 0) 84 if (state.index === 0)
38 classes += ' line-background-' + row.type + ' line-' + row.type; 85 classes += ' line-background-' + row.type + ' line-' + row.type;
39 stream.pos += row.content[state.index].text.length; 86 var chars = row.content[state.index].text.length;
87 if (state.mismatch > 0)
luoe 2017/03/30 01:10:40 Replace mismatch with state.diffPos > state.syntax
einbinder 2017/03/30 02:22:44 Done.
88 chars = state.mismatch;
89 var pos = stream.pos;
90 var innerStyle = state.lastInnerStyle;
91 var innerPos = pos - state.mismatch;
luoe 2017/03/30 01:10:39 Proposed names: chars => diffPos innerPos => synta
einbinder 2017/03/30 02:22:43 Done.
92 if (state.mismatch >= 0) {
93 if (row.type === Changes.ChangesView.RowType.Deletion || row.type === Ch anges.ChangesView.RowType.Addition ||
94 row.type === Changes.ChangesView.RowType.Equal) {
95 innerStyle = innerMode.token(
96 stream, row.type === Changes.ChangesView.RowType.Deletion ? state. baselineState : state.currentState);
97 innerPos = stream.pos;
98 } else {
99 innerStyle = '';
100 innerPos = pos + chars;
101 }
102 }
103 stream.pos = Math.min(innerPos, pos + chars);
104 if (innerStyle)
105 classes += ' ' + innerStyle;
40 classes += ' ' + row.content[state.index].className; 106 classes += ' ' + row.content[state.index].className;
41 state.index++; 107 state.mismatch = pos + chars - innerPos;
108 if (state.mismatch <= 0) {
109 state.index++;
luoe 2017/03/30 01:10:39 diffTokenIndex? Perhaps consider moving the ` if
einbinder 2017/03/30 02:22:43 Done.
110 state.lastInnerStyle = innerStyle;
111 }
42 if (state.index >= row.content.length) { 112 if (state.index >= row.content.length) {
43 state.lineNumber++; 113 state.lineNumber++;
114 if (row.type === Changes.ChangesView.RowType.Deletion)
115 state.baselineLineNumber++;
116 else
117 state.currentLineNumber++;
luoe 2017/03/30 01:10:39 Spacers don't need to increment this?
einbinder 2017/03/30 02:22:43 Done.
44 state.index = 0; 118 state.index = 0;
45 } 119 }
46 return classes; 120 return classes;
47 }, 121 },
48 122
49 /** 123 /**
50 * @param {!Changes.ChangesHighlighter.DiffState} state 124 * @param {!Changes.ChangesHighlighter.DiffState} state
51 * @return {string} 125 * @return {string}
52 */ 126 */
53 blankLine: function(state) { 127 blankLine: function(state) {
54 var row = rows[state.lineNumber]; 128 var row = rows[state.lineNumber];
55 state.lineNumber++; 129 state.lineNumber++;
130 state.mismatch = 0;
56 state.index = 0; 131 state.index = 0;
57 if (!row) 132 if (!row)
58 return ''; 133 return '';
59 return 'line-background-' + row.type + ' line-' + row.type; 134 if (row.type === Changes.ChangesView.RowType.Deletion)
135 state.baselineLineNumber++;
136 else
137 state.currentLineNumber++;
138 var style = '';
139 if (innerMode.blankLine) {
140 style = innerMode.blankLine(
141 row.type === Changes.ChangesView.RowType.Deletion ? state.baselineSt ate : state.currentState);
142 }
143 return style + ' line-background-' + row.type + ' line-' + row.type;
144 },
145
146 /**
147 * @param {!Changes.ChangesHighlighter.DiffState} state
148 * @return {!Changes.ChangesHighlighter.DiffState}
149 */
150 copyState: function(state) {
151 var newState = /** @type {!Changes.ChangesHighlighter.DiffState} */ ({});
152 for (var i in state)
153 newState[i] = state[i];
154 newState.currentState = CodeMirror.copyState(innerMode, state.currentState );
155 newState.baselineState = CodeMirror.copyState(innerMode, state.baselineSta te);
156 return newState;
60 } 157 }
61 }; 158 };
62 }; 159 };
63 160
64 /** @typedef {!{lineNumber: number, index: number}} */ 161 /** @typedef {!{lineNumber: number, index: number}} */
65 Changes.ChangesHighlighter.DiffState; 162 Changes.ChangesHighlighter.DiffState;
66 163
67 CodeMirror.defineMode('devtools-diff', Changes.ChangesHighlighter); 164 CodeMirror.defineMode('devtools-diff', Changes.ChangesHighlighter);
OLDNEW
« 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