@@ -25,10 +25,10 @@ class AnalysisResultsController {
2525 final DElement toggle;
2626 bool _flashHidden;
2727
28- final StreamController <AnalysisIssue > _onClickController =
28+ final StreamController <Location > _onClickController =
2929 StreamController .broadcast ();
3030
31- Stream <AnalysisIssue > get onIssueClick => _onClickController.stream;
31+ Stream <Location > get onItemClicked => _onClickController.stream;
3232
3333 AnalysisResultsController (this .flash, this .message, this .toggle) {
3434 // Show issues by default, but hide the flash element (otherwise an empty
@@ -70,29 +70,80 @@ class AnalysisResultsController {
7070 message.text = '$amount ${amount == 1 ? 'issue' : 'issues' }' ;
7171
7272 flash.clearChildren ();
73- for (var elem in issues.map (_issueElement)) {
73+ for (var issue in issues) {
74+ var elem = _issueElement (issue);
7475 flash.add (elem);
76+
77+ for (var diagnostic in issue.diagnosticMessages) {
78+ var diagnosticElement = _diagnosticElement (diagnostic);
79+ flash.add (diagnosticElement);
80+ }
7581 }
7682 }
7783
7884 Element _issueElement (AnalysisIssue issue) {
7985 var message = issue.message;
80- if (issue.message.endsWith ('.' )) {
81- message = message.substring (0 , message.length - 1 );
82- }
8386
84- var elem = DivElement ()..classes.add ( 'issue' );
87+ var elem = DivElement ()..classes.addAll ([ 'issue' , 'clickable' ] );
8588
8689 elem.children.add (SpanElement ()
8790 ..text = issue.kind
8891 ..classes.addAll (_classesForType[issue.kind]));
8992
93+ var columnElem = DivElement ()..classes.add ('issue-column' );
94+
95+ var messageSpan = DivElement ()
96+ ..text = '$message (line ${issue .line })'
97+ ..classes.add ('message' );
98+ columnElem.children.add (messageSpan);
99+
100+ // Add the correction, if any.
101+ if (issue.correction != null && issue.correction.isNotEmpty) {
102+ columnElem.children.add (DivElement ()
103+ ..text = issue.correction
104+ ..classes.add ('message' ));
105+ }
106+
107+ // Add a link to the documentation
108+ if (issue.url != null && issue.url.isNotEmpty) {
109+ columnElem.children.add (AnchorElement ()
110+ ..href = issue.url
111+ ..text = ' Open Documentation'
112+ ..target = '_blank'
113+ ..classes.add ('issue-anchor' ));
114+ }
115+
116+ elem.children.add (columnElem);
117+
118+ elem.onClick.listen ((_) {
119+ _onClickController.add (Location (
120+ line: issue.line,
121+ charStart: issue.charStart,
122+ charLength: issue.charLength));
123+ });
124+
125+ return elem;
126+ }
127+
128+ Element _diagnosticElement (DiagnosticMessage diagnosticMessage) {
129+ var message = diagnosticMessage.message;
130+ if (message.endsWith ('.' )) {
131+ message = message.substring (0 , message.length - 1 );
132+ }
133+
134+ var elem = DivElement ()..classes.addAll (['issue' , 'clickable' ]);
135+
136+ elem.children.add (SpanElement ()..classes.add ('issue-indent' ));
137+
90138 elem.children.add (SpanElement ()
91- ..text = '$ message - line ${ issue . line }'
139+ ..text = message
92140 ..classes.add ('message' ));
93141
94142 elem.onClick.listen ((_) {
95- _onClickController.add (issue);
143+ _onClickController.add (Location (
144+ line: diagnosticMessage.line,
145+ charStart: diagnosticMessage.charStart,
146+ charLength: diagnosticMessage.charLength));
96147 });
97148
98149 return elem;
@@ -118,3 +169,16 @@ class AnalysisResultsController {
118169 toggle.text = _hideMsg;
119170 }
120171}
172+
173+ /// A range of text in the file.
174+ class Location {
175+ final int line;
176+ final int charStart;
177+ final int charLength;
178+
179+ Location ({
180+ this .line,
181+ this .charStart,
182+ this .charLength,
183+ });
184+ }
0 commit comments