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

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: rename 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
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 syntaxHighlightMode = 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 fastForwardSyntaxHighlighter(state.baselineSyntaxState, state.baselineLine Number, baselineLineNumber, baselineLines);
29 state.baselineLineNumber = baselineLineNumber;
30 }
31 if (currentLineNumber > state.currentLineNumber) {
32 fastForwardSyntaxHighlighter(state.currentSyntaxState, state.currentLineNu mber, currentLineNumber, currentLines);
33 state.currentLineNumber = currentLineNumber;
34 }
35 }
36
37 /**
38 * @param {!Object} syntaxState
39 * @param {number} from
40 * @param {number} to
41 * @param {!Array<string>} lines
42 */
43 function fastForwardSyntaxHighlighter(syntaxState, from, to, lines) {
44 var lineNumber = from;
45 while (lineNumber < to && lineNumber < lines.length) {
46 var stream = new CodeMirror.StringStream(lines[lineNumber]);
47 if (stream.eol() && syntaxHighlightMode.blankLine)
48 syntaxHighlightMode.blankLine(syntaxState);
49 while (!stream.eol()) {
50 syntaxHighlightMode.token(stream, syntaxState);
51 stream.start = stream.pos;
52 }
53 lineNumber++;
54 }
55 }
16 56
17 return { 57 return {
18 /** 58 /**
19 * @return {!Changes.ChangesHighlighter.DiffState} 59 * @return {!Changes.ChangesHighlighter.DiffState}
20 */ 60 */
21 startState: function() { 61 startState: function() {
22 return {lineNumber: 0, index: 0}; 62 return {
63 lineNumber: 0,
lushnikov 2017/04/03 23:11:19 rowNumber
einbinder 2017/04/04 22:21:53 Done.
64 diffTokenIndex: 0,
65 currentLineNumber: 0,
66 baselineLineNumber: 0,
67 currentSyntaxState: CodeMirror.startState(syntaxHighlightMode),
68 baselineSyntaxState: CodeMirror.startState(syntaxHighlightMode),
69 syntaxPosition: 0,
70 diffPosition: 0,
71 syntaxStyle: '',
72 diffStyle: ''
73 };
23 }, 74 },
24 75
25 /** 76 /**
26 * @param {!{next: function()}} stream 77 * @param {!{next: function()}} stream
27 * @param {!Changes.ChangesHighlighter.DiffState} state 78 * @param {!Changes.ChangesHighlighter.DiffState} state
28 * @return {string} 79 * @return {string}
29 */ 80 */
30 token: function(stream, state) { 81 token: function(stream, state) {
31 var row = rows[state.lineNumber]; 82 var row = rows[state.lineNumber];
32 if (!row) { 83 if (!row) {
33 stream.next(); 84 stream.next();
34 return ''; 85 return '';
35 } 86 }
87 fastForward(state, row.baselineLineNumber - 1, row.currentLineNumber - 1);
36 var classes = ''; 88 var classes = '';
37 if (state.index === 0) 89 if (stream.pos === 0)
38 classes += ' line-background-' + row.type + ' line-' + row.type; 90 classes += ' line-background-' + row.type + ' line-' + row.type;
39 stream.pos += row.content[state.index].text.length; 91
40 classes += ' ' + row.content[state.index].className; 92 if (state.diffPosition <= state.syntaxPosition) {
41 state.index++; 93 state.diffPosition += row.content[state.diffTokenIndex].text.length;
lushnikov 2017/04/03 23:11:19 row.tokens
einbinder 2017/04/04 22:21:53 Done.
42 if (state.index >= row.content.length) { 94 state.diffStyle = row.content[state.diffTokenIndex].className;
95 state.diffTokenIndex++;
96 }
97
98 if (state.diffPosition >= state.syntaxPosition) {
lushnikov 2017/04/03 23:11:19 this starts to depend on execution of previous if-
einbinder 2017/04/04 22:21:53 Done.
99 if (row.type === Changes.ChangesView.RowType.Deletion || row.type === Ch anges.ChangesView.RowType.Addition ||
100 row.type === Changes.ChangesView.RowType.Equal) {
101 state.syntaxStyle = syntaxHighlightMode.token(
102 stream, row.type === Changes.ChangesView.RowType.Deletion ? state. baselineSyntaxState : state.currentSyntaxState);
103 state.syntaxPosition = stream.pos;
104 } else {
105 state.syntaxStyle = '';
106 state.syntaxPosition = state.diffPosition;
107 }
108 }
109
110 stream.pos = Math.min(state.syntaxPosition, state.diffPosition);
111 classes += ' ' + state.syntaxStyle;
112 classes += ' ' + state.diffStyle;
113
114 if (stream.eol()) {
43 state.lineNumber++; 115 state.lineNumber++;
44 state.index = 0; 116 if (row.type === Changes.ChangesView.RowType.Deletion)
117 state.baselineLineNumber++;
118 else
119 state.currentLineNumber++;
120 state.diffPosition = 0;
121 state.syntaxPosition = 0;
122 state.diffTokenIndex = 0;
45 } 123 }
46 return classes; 124 return classes;
47 }, 125 },
48 126
49 /** 127 /**
50 * @param {!Changes.ChangesHighlighter.DiffState} state 128 * @param {!Changes.ChangesHighlighter.DiffState} state
51 * @return {string} 129 * @return {string}
52 */ 130 */
53 blankLine: function(state) { 131 blankLine: function(state) {
54 var row = rows[state.lineNumber]; 132 var row = rows[state.lineNumber];
55 state.lineNumber++; 133 state.lineNumber++;
56 state.index = 0; 134 state.syntaxPosition = 0;
135 state.diffPosition = 0;
136 state.diffTokenIndex = 0;
57 if (!row) 137 if (!row)
58 return ''; 138 return '';
59 return 'line-background-' + row.type + ' line-' + row.type; 139 if (row.type === Changes.ChangesView.RowType.Deletion)
lushnikov 2017/04/03 23:11:19 it's unclear why this and the following are non-sy
einbinder 2017/04/04 22:21:53 Done.
140 state.baselineLineNumber++;
141 else if (row.type === Changes.ChangesView.RowType.Equal || row.type === Ch anges.ChangesView.RowType.Addition)
142 state.currentLineNumber++;
143 var style = '';
144 if (syntaxHighlightMode.blankLine) {
145 style = syntaxHighlightMode.blankLine(
146 row.type === Changes.ChangesView.RowType.Deletion ? state.baselineSy ntaxState : state.currentSyntaxState);
lushnikov 2017/04/03 23:11:19 row => diffRow to be coherent with ChangesView
einbinder 2017/04/04 22:21:53 Done.
147 }
148 return style + ' line-background-' + row.type + ' line-' + row.type;
149 },
150
151 /**
152 * @param {!Changes.ChangesHighlighter.DiffState} state
153 * @return {!Changes.ChangesHighlighter.DiffState}
154 */
155 copyState: function(state) {
156 var newState = /** @type {!Changes.ChangesHighlighter.DiffState} */ ({});
157 for (var i in state)
lushnikov 2017/04/03 23:11:19 Object.assign?!
einbinder 2017/04/04 22:21:53 Done.
158 newState[i] = state[i];
159 newState.currentSyntaxState = CodeMirror.copyState(syntaxHighlightMode, st ate.currentSyntaxState);
160 newState.baselineSyntaxState = CodeMirror.copyState(syntaxHighlightMode, s tate.baselineSyntaxState);
161 return newState;
60 } 162 }
61 }; 163 };
62 }; 164 };
63 165
64 /** @typedef {!{lineNumber: number, index: number}} */ 166 /**
167 * @typedef {!{
168 * lineNumber: number,
169 * diffTokenIndex: number,
170 * currentLineNumber: number,
171 * baselineLineNumber: number,
172 * currentSyntaxState: !Object,
173 * baselineSyntaxState: !Object,
174 * syntaxPosition: number,
175 * diffPosition: number,
176 * syntaxStyle: string,
177 * diffStyle: string
178 * }}
179 */
65 Changes.ChangesHighlighter.DiffState; 180 Changes.ChangesHighlighter.DiffState;
66 181
67 CodeMirror.defineMode('devtools-diff', Changes.ChangesHighlighter); 182 CodeMirror.defineMode('devtools-diff', Changes.ChangesHighlighter);
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698