| // Copyright 2015 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| "use strict"; |
| |
| class ScheduleView extends TextView { |
| constructor(id, broker) { |
| super(id, broker, null, false); |
| let view = this; |
| let BLOCK_STYLE = { |
| css: 'tag' |
| }; |
| const BLOCK_HEADER_STYLE = { |
| css: 'com', |
| block_id: -1, |
| location: function(text) { |
| let matches = /\d+/.exec(text); |
| if (!matches) return undefined; |
| BLOCK_HEADER_STYLE.block_id = Number(matches[0]); |
| return { |
| block_id: BLOCK_HEADER_STYLE.block_id |
| }; |
| }, |
| }; |
| const BLOCK_LINK_STYLE = { |
| css: 'tag', |
| link: function(text) { |
| let id = Number(text.substr(1)); |
| view.select(function(location) { return location.block_id == id; }, true, true); |
| } |
| }; |
| const ID_STYLE = { |
| css: 'tag', |
| location: function(text) { |
| let matches = /\d+/.exec(text); |
| return { |
| node_id: Number(matches[0]), |
| block_id: BLOCK_HEADER_STYLE.block_id |
| }; |
| }, |
| }; |
| const ID_LINK_STYLE = { |
| css: 'tag', |
| link: function(text) { |
| let id = Number(text); |
| view.select(function(location) { return location.node_id == id; }, true, true); |
| } |
| }; |
| const NODE_STYLE = { css: 'kwd' }; |
| const GOTO_STYLE = { css: 'kwd', |
| goto_id: -2, |
| location: function(text) { |
| return { |
| node_id: GOTO_STYLE.goto_id--, |
| block_id: BLOCK_HEADER_STYLE.block_id |
| }; |
| } |
| } |
| const ARROW_STYLE = { css: 'kwd' }; |
| let patterns = [ |
| [ |
| [/^--- BLOCK B\d+/, BLOCK_HEADER_STYLE, 1], |
| [/^\s+\d+: /, ID_STYLE, 2], |
| [/^\s+Goto/, GOTO_STYLE, 6], |
| [/^.*/, null, -1] |
| ], |
| [ |
| [/^ +/, null], |
| [/^\(deferred\)/, BLOCK_HEADER_STYLE], |
| [/^B\d+/, BLOCK_LINK_STYLE], |
| [/^<-/, ARROW_STYLE], |
| [/^->/, ARROW_STYLE], |
| [/^,/, null], |
| [/^---/, BLOCK_HEADER_STYLE, -1] |
| ], |
| // Parse opcode including [] |
| [ |
| [/^[A-Za-z0-9_]+(\[.*\])?$/, NODE_STYLE, -1], |
| [/^[A-Za-z0-9_]+(\[(\[.*?\]|.)*?\])?/, NODE_STYLE, 3] |
| ], |
| // Parse optional parameters |
| [ |
| [/^ /, null, 4], |
| [/^\(/, null], |
| [/^\d+/, ID_LINK_STYLE], |
| [/^, /, null], |
| [/^\)$/, null, -1], |
| [/^\)/, null, 4], |
| ], |
| [ |
| [/^ -> /, ARROW_STYLE, 5], |
| [/^.*/, null, -1] |
| ], |
| [ |
| [/^B\d+$/, BLOCK_LINK_STYLE, -1], |
| [/^B\d+/, BLOCK_LINK_STYLE], |
| [/^, /, null] |
| ], |
| [ |
| [/^ -> /, ARROW_STYLE], |
| [/^B\d+$/, BLOCK_LINK_STYLE, -1] |
| ] |
| ]; |
| this.setPatterns(patterns); |
| } |
| |
| initializeContent(data, rememberedSelection) { |
| super.initializeContent(data, rememberedSelection); |
| var graph = this; |
| var locations = []; |
| for (var id of rememberedSelection) { |
| locations.push({ node_id : id }); |
| } |
| this.selectLocations(locations, true, true); |
| } |
| |
| detachSelection() { |
| var selection = this.selection.detachSelection(); |
| var s = new Set(); |
| for (var i of selection) { |
| if (i.location.node_id != undefined && i.location.node_id > 0) { |
| s.add(i.location.node_id); |
| } |
| }; |
| return s; |
| } |
| } |