@@ -7,6 +7,7 @@ import 'dart:async';
7
7
import 'package:analyzer/dart/ast/ast.dart' ;
8
8
import 'package:analyzer/dart/element/element2.dart' ;
9
9
import 'package:build/build.dart' ;
10
+ import 'package:source_span/source_span.dart' ;
10
11
11
12
import 'library.dart' ;
12
13
import 'span_for_element.dart' ;
@@ -45,59 +46,92 @@ class InvalidGenerationSource implements Exception {
45
46
/// May be an empty string if unknown.
46
47
final String todo;
47
48
48
- /// The code element associated with this error.
49
- ///
50
- /// May be `null` if the error had no associated element, or if the location
51
- /// was passed with [node] .
49
+ /// The [Element2] associated with this error, if any.
52
50
final Element2 ? element;
53
51
54
- /// The AST Node associated with this error.
55
- ///
56
- /// May be `null` if the error has no associated node in the input source
57
- /// code, or if the location was passed with [element] .
52
+ /// The [ElementDirective] associated with this error, if any .
53
+ final ElementDirective ? elementDirective;
54
+
55
+ /// The [AstNode] associated with this error, if any .
58
56
final AstNode ? node;
59
57
58
+ /// The [Fragment] associated with this error, if any.
59
+ final Fragment ? fragment;
60
+
60
61
InvalidGenerationSource (
61
62
this .message, {
63
+ Annotatable ? annotatable,
62
64
this .todo = '' ,
63
- this .element,
65
+ Element2 ? element,
66
+ ElementDirective ? elementDirective,
67
+ Fragment ? fragment,
64
68
this .node,
65
- });
69
+ }) : element =
70
+ element ??
71
+ (annotatable is Element2 ? annotatable : null ) as Element2 ? ,
72
+ elementDirective =
73
+ elementDirective ??
74
+ (annotatable is ElementDirective ? annotatable : null ),
75
+ fragment =
76
+ fragment ??
77
+ (annotatable is Fragment ? annotatable : null ) as Fragment ? ;
66
78
67
79
@override
68
80
String toString () {
69
81
final buffer = StringBuffer (message);
70
82
83
+ // If possible render a span, if a span can't be computed show any cause
84
+ // object.
85
+ SourceSpan ? span;
86
+ Object ? cause;
87
+
71
88
if (element case final element? ) {
72
89
try {
73
- final span = spanForElement (element);
74
- buffer
75
- ..writeln ()
76
- ..writeln (span.start.toolString)
77
- ..write (span.highlight ());
90
+ span = spanForElement (element);
78
91
} catch (_) {
79
- // Source for `element` wasn't found, it must be in a summary with no
80
- // associated source. We can still give the name.
81
- buffer
82
- ..writeln ()
83
- ..writeln ('Cause: $element ' );
92
+ cause = element;
84
93
}
85
94
}
86
95
87
- if (node case final node ? ) {
96
+ if (elementDirective case final elementDirective ? ) {
88
97
try {
89
- final span = spanForNode (node);
90
- buffer
91
- ..writeln ()
92
- ..writeln (span.start.toolString)
93
- ..write (span.highlight ());
98
+ span = spanForElementDirective (elementDirective);
94
99
} catch (_) {
95
- buffer
96
- ..writeln ()
97
- ..writeln ('Cause: $node ' );
100
+ cause = elementDirective;
98
101
}
99
102
}
100
103
104
+ if (span == null ) {
105
+ if (node case final node? ) {
106
+ try {
107
+ span = spanForNode (node);
108
+ } catch (_) {
109
+ cause = node;
110
+ }
111
+ }
112
+ }
113
+
114
+ if (span == null ) {
115
+ if (fragment case final fragment? ) {
116
+ try {
117
+ span = spanForFragment (fragment);
118
+ } catch (_) {
119
+ cause = fragment;
120
+ }
121
+ }
122
+ }
123
+
124
+ if (span != null ) {
125
+ buffer
126
+ ..writeln ()
127
+ ..writeln (span.start.toolString)
128
+ ..write (span.highlight ());
129
+ } else if (cause != null ) {
130
+ buffer
131
+ ..writeln ()
132
+ ..writeln ('Cause: $cause ' );
133
+ }
134
+
101
135
return buffer.toString ();
102
136
}
103
137
}
0 commit comments