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

Side by Side Diff: lib/runtime/messages_widget.dart

Issue 1788973002: Remove code that requires whole-program compile (Closed) Base URL: git@github.com:dart-lang/dev_compiler.git@master
Patch Set: merged Created 4 years, 9 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 | « lib/runtime/messages.css ('k') | lib/runtime/messages_widget.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file.
4
5 /// This library displays [MessageSummary]s from the Dart Dev Compiler.
6
7 import 'dart:convert';
8 import 'dart:html';
9
10 import 'package:dev_compiler/src/summary.dart';
11 import 'package:source_span/source_span.dart';
12
13 main() async {
14 await window.animationFrame;
15 displayMessages(await HttpRequest.getString('messages.json'));
16 }
17
18 void displayMessages(String data) {
19 var summary = GlobalSummary.parse(JSON.decode(data));
20 var messagesByLevel = _getMessagesByLevel(summary);
21 if (messagesByLevel.isEmpty) return;
22
23 // Build the wrapper, menu, and content divs.
24 var menuWrapper = new DivElement()..classes.add('menu');
25 var contentWrapper = new DivElement()..classes.add('content');
26 var wrapperDiv = new DivElement()
27 ..classes.add('dev-compiler-messages')
28 ..append(menuWrapper)
29 ..append(contentWrapper);
30
31 var selectedMenu = new _Selection();
32 var selectedContent = new _Selection();
33
34 // Add a menu item, content section, and messages for each log level.
35 messagesByLevel.forEach((level, messages) {
36 var contentItem = new DivElement()..classes.add(level);
37 var menuItem = new Element.html('<div class="$level">'
38 '$level <span class="num">(${messages.length})</span>'
39 '</div>');
40 menuWrapper.append(menuItem);
41 contentWrapper.append(contentItem);
42 menuItem.onClick.listen((_) {
43 selectedMenu.select(menuItem);
44 selectedContent.select(contentItem);
45 });
46
47 // TODO(sigmund): add permanent links to error messages like in polymer.
48 for (var m in messages) {
49 var message = _hyperlinkUrls(_escape(m.message));
50 var span = m.span;
51 var sb = new StringBuffer();
52 sb.write('<div class="message"><div class="text $level">$message</div>');
53 if (span != null) {
54 sb.write('<div class="location">'
55 ' <span class="location">${span.start.toolString}</span></div>'
56 ' <span class="text">');
57 if (span is SourceSpanWithContext) {
58 sb.write(_escape(span.context.substring(0, span.start.column)));
59 sb.write('<span class="$level">');
60 sb.write(_escape(span.text));
61 sb.write('</span>');
62 var end = span.start.column + span.text.length;
63 sb.write(_escape(span.context.substring(end)));
64 } else {
65 sb.write(_escape(span.text));
66 }
67 sb.write('</span></div></div>');
68 }
69 sb.write('</div>');
70
71 var logElement = new Element.html('$sb',
72 validator: new NodeValidatorBuilder.common()
73 ..allowNavigation(new _OpenUriPolicy()));
74 contentItem.append(logElement);
75 var messageElement = logElement.querySelector('div.text');
76 messageElement.onClick.listen((e) {
77 if (e.target == messageElement) {
78 messageElement.classes.toggle('expanded');
79 }
80 });
81 }
82 });
83
84 document.body.append(wrapperDiv);
85 }
86
87 /// Toggles classes to match which item of a list of items is selected.
88 class _Selection {
89 Element _selected;
90
91 select(Element newItem) {
92 if (_selected == newItem) {
93 _selected = null;
94 } else {
95 if (_selected != null) {
96 _selected.classes.remove('active');
97 }
98 _selected = newItem;
99 }
100 newItem.classes.toggle('active');
101 }
102 }
103
104 final _urlRegex = new RegExp('http://[^ ]*');
105 final _escaper = new HtmlEscape();
106 String _hyperlinkUrls(String text) => text.replaceAllMapped(_urlRegex,
107 (m) => '<a href="${m.group(0)}" target="blank">${m.group(0)}</a>');
108 String _escape(String text) => _escaper.convert(text);
109
110 class _OpenUriPolicy implements UriPolicy {
111 bool allowsUri(String uri) => true;
112 }
113
114 Map<String, List<MessageSummary>> _getMessagesByLevel(GlobalSummary messages) {
115 var visitor = new _Visitor();
116 messages.accept(visitor);
117 return visitor.messagesByLevel;
118 }
119
120 class _Visitor extends RecursiveSummaryVisitor {
121 final Map<String, List<MessageSummary>> messagesByLevel = {};
122
123 @override
124 void visitMessage(MessageSummary message) {
125 var level = message.level.toLowerCase();
126 messagesByLevel.putIfAbsent(level, () => []);
127 messagesByLevel[level].add(message);
128 }
129 }
OLDNEW
« no previous file with comments | « lib/runtime/messages.css ('k') | lib/runtime/messages_widget.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698