| OLD | NEW |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 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 | 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. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 // An update to this file must be followed by regenerating the corresponding | 5 // An update to this file must be followed by regenerating the corresponding |
| 6 // json, dart2js and analyzer file. Use `publish.dart` in the bin directory. | 6 // json, dart2js and analyzer file. Use `publish.dart` in the bin directory. |
| 7 // | 7 // |
| 8 // Every message in this file must have an id. Use `message_id.dart` in the | 8 // Every message in this file must have an id. Use `message_id.dart` in the |
| 9 // bin directory to generate a fresh one. | 9 // bin directory to generate a fresh one. |
| 10 | 10 |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 63 /// Encodes the category of the message. | 63 /// Encodes the category of the message. |
| 64 /// | 64 /// |
| 65 /// This is currently only used in the analyzer. | 65 /// This is currently only used in the analyzer. |
| 66 // TODO(floitsch): encode severity and type in the category, so we can generate | 66 // TODO(floitsch): encode severity and type in the category, so we can generate |
| 67 // the corresponding ErrorCode subclasses. | 67 // the corresponding ErrorCode subclasses. |
| 68 class Category { | 68 class Category { |
| 69 static final analysisOptionsError = new Category("AnalysisOptionsError"); | 69 static final analysisOptionsError = new Category("AnalysisOptionsError"); |
| 70 | 70 |
| 71 static final analysisOptionsWarning = new Category("AnalysisOptionsWarning"); | 71 static final analysisOptionsWarning = new Category("AnalysisOptionsWarning"); |
| 72 | 72 |
| 73 static final checkedModeCompileTimeError = new Category( | 73 static final checkedModeCompileTimeError = |
| 74 "CheckedModeCompileTimeError"); | 74 new Category("CheckedModeCompileTimeError"); |
| 75 |
| 76 static final parserError = new Category("ParserError"); |
| 75 | 77 |
| 76 final String name; | 78 final String name; |
| 77 | 79 |
| 78 Category(this.name); | 80 Category(this.name); |
| 79 } | 81 } |
| 80 | 82 |
| 83 enum Platform { |
| 84 dart2js, analyzer, |
| 85 } |
| 86 const dart2js = Platform.dart2js; |
| 87 const analyzer = Platform.analyzer; |
| 81 | 88 |
| 82 class Message { | 89 class Message { |
| 83 final String id; | 90 final String id; |
| 91 final int subId; |
| 84 final Category category; | 92 final Category category; |
| 85 final String template; | 93 final String template; |
| 86 // The analyzer fills holes positionally (and not named). The following field | 94 // The analyzer fills holes positionally (and not named). The following field |
| 87 // overrides the order of the holes. | 95 // overrides the order of the holes. |
| 88 // For example the template "The argument #field in #cls is bad", could have | 96 // For example the template "The argument #field in #cls is bad", could have |
| 89 // the order `["cls", "field"]', which means that the analyzer would first | 97 // the order `["cls", "field"]', which means that the analyzer would first |
| 90 // provide the class `cls` and then only `field`. | 98 // provide the class `cls` and then only `field`. |
| 91 // This list is generally `null`, but when it is provided it must contain all | 99 // This list is generally `null`, but when it is provided it must contain all |
| 92 // holes. | 100 // holes. |
| 93 final List templateHoleOrder; | 101 final List<String> templateHoleOrder; |
| 94 final String howToFix; | 102 final String howToFix; |
| 95 final List<String> options; | 103 final List<String> options; |
| 96 final List examples; | 104 final List examples; |
| 105 final List<Platform> usedBy; |
| 97 | 106 |
| 98 Message({this.id, this.category, this.template, this.templateHoleOrder, | 107 Message( |
| 99 this.howToFix, this.options, this.examples}); | 108 {this.id, |
| 109 this.subId: 0, |
| 110 this.category, |
| 111 this.template, |
| 112 this.templateHoleOrder, |
| 113 this.howToFix, |
| 114 this.options, |
| 115 this.usedBy: const [], |
| 116 this.examples}); |
| 100 } | 117 } |
| 101 | 118 |
| 102 String get messagesAsJson { | 119 String get messagesAsJson { |
| 103 var jsonified = {}; | 120 var jsonified = {}; |
| 104 MESSAGES.forEach((String name, Message message) { | 121 MESSAGES.forEach((String name, Message message) { |
| 105 jsonified[name] = { | 122 jsonified[name] = { |
| 106 'id': message.id, | 123 'id': message.id, |
| 124 'subId': message.subId, |
| 107 'category': message.category.name, | 125 'category': message.category.name, |
| 108 'template': message.template, | 126 'template': message.template, |
| 109 'howToFix': message.howToFix | 127 'templateHoleOrder': message.templateHoleOrder, |
| 128 'howToFix': message.howToFix, |
| 129 'options': message.options, |
| 130 'usedBy': message.usedBy.map((platform) => platform.toString()).toList(), |
| 131 'examples': message.examples, |
| 110 }; | 132 }; |
| 111 }); | 133 }); |
| 112 return JSON.encode(jsonified); | 134 return JSON.encode(jsonified); |
| 113 } | 135 } |
| 114 | 136 |
| 115 final Map<String, Message> MESSAGES = { | 137 final Map<String, Message> MESSAGES = { |
| 116 'exampleMessage': new Message( | 138 'exampleMessage': new Message( |
| 117 id: 'use an Id generated by bin/message_id.dart', | 139 id: 'use an Id generated by bin/message_id.dart', |
| 118 category: Category.analysisOptionsError, | 140 category: Category.analysisOptionsError, |
| 119 template: "#use #named #arguments", | 141 template: "#use #named #arguments", |
| 120 templateHoleOrder: ["arguments", "named", "use"], | 142 templateHoleOrder: ["arguments", "named", "use"], |
| 121 howToFix: "an explanation on how to fix things", | 143 howToFix: "an explanation on how to fix things", |
| 122 examples: [r''' | 144 examples: [ |
| 145 r''' |
| 123 Some multiline example; | 146 Some multiline example; |
| 124 That generates the bug.''', | 147 That generates the bug.''', |
| 125 { | 148 { |
| 126 'fileA.dart': ''' | 149 'fileA.dart': ''' |
| 127 or a map from file to content. | 150 or a map from file to content. |
| 128 again multiline''', | 151 again multiline''', |
| 129 'fileB.dart': ''' | 152 'fileB.dart': ''' |
| 130 with possibly multiple files. | 153 with possibly multiple files. |
| 131 muliline too''' | 154 muliline too''' |
| 132 } | 155 } |
| 133 ] | 156 ]), |
| 134 ), | 157 |
| 158 // Const constructors (factory or not) may not have a body. |
| 159 'CONST_CONSTRUCTOR_OR_FACTORY_WITH_BODY': new Message( |
| 160 id: 'LGJGHW', |
| 161 subId: 0, |
| 162 category: Category.parserError, |
| 163 template: "Const constructor or factory can't have a body.", |
| 164 howToFix: "Remove the 'const' keyword or the body.", |
| 165 usedBy: [dart2js], |
| 166 examples: const [ |
| 167 r""" |
| 168 class C { |
| 169 const C() {} |
| 170 } |
| 171 |
| 172 main() => new C();""", |
| 173 r""" |
| 174 class C { |
| 175 const factory C() {} |
| 176 } |
| 177 |
| 178 main() => new C();""" |
| 179 ]), |
| 180 // Const constructors may not have a body. |
| 181 'CONST_CONSTRUCTOR_WITH_BODY': new Message( |
| 182 id: 'LGJGHW', |
| 183 subId: 1, |
| 184 category: Category.parserError, |
| 185 template: "Const constructor can't have a body.", |
| 186 howToFix: "Try removing the 'const' keyword or the body.", |
| 187 usedBy: [analyzer], |
| 188 examples: const [ |
| 189 r""" |
| 190 class C { |
| 191 const C() {} |
| 192 } |
| 193 |
| 194 main() => new C();""" |
| 195 ]), |
| 196 // Const constructor factories may only redirect (and must not have a body). |
| 197 'CONST_FACTORY': new Message( |
| 198 id: 'LGJGHW', |
| 199 subId: 2, |
| 200 category: Category.parserError, |
| 201 template: "Only redirecting factory constructors can be declared to " |
| 202 "be 'const'.", |
| 203 howToFix: "Try removing the 'const' keyword or replacing the body with " |
| 204 "'=' followed by a valid target", |
| 205 usedBy: [analyzer], |
| 206 examples: const [ |
| 207 r""" |
| 208 class C { |
| 209 const factory C() {} |
| 210 } |
| 211 |
| 212 main() => new C();""" |
| 213 ]), |
| 135 }; | 214 }; |
| OLD | NEW |