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 import 'dart:convert'; | 5 import 'dart:convert'; |
6 import 'dart:io' as io; | 6 import 'dart:io' as io; |
7 | 7 |
8 import '../lib/shared_messages.dart'; | 8 import '../lib/shared_messages.dart'; |
9 | 9 |
10 const String jsonPath = '../lib/generated/shared_messages.json'; | 10 const String jsonPath = '../lib/generated/shared_messages.json'; |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
165 if (index == null) { | 165 if (index == null) { |
166 throw "Couldn't find hole-position for $holeName $holeMap"; | 166 throw "Couldn't find hole-position for $holeName $holeMap"; |
167 } | 167 } |
168 return "{$index}"; | 168 return "{$index}"; |
169 } else { | 169 } else { |
170 return "{${seenHoles++}}"; | 170 return "{${seenHoles++}}"; |
171 } | 171 } |
172 }); | 172 }); |
173 } | 173 } |
174 | 174 |
| 175 String camlToAllCaps(String input) { |
| 176 StringBuffer out = new StringBuffer(); |
| 177 for (int i = 0; i < input.length; i++) { |
| 178 String c = input[i]; |
| 179 if (c.toUpperCase() == c) { |
| 180 out.write("_$c"); |
| 181 } else { |
| 182 out.write(c.toUpperCase()); |
| 183 } |
| 184 } |
| 185 return out.toString(); |
| 186 } |
| 187 |
175 /// Emits the messages in analyzer format. | 188 /// Emits the messages in analyzer format. |
176 /// | 189 /// |
177 /// Messages are encoded as instances of `ErrorCode` classes where the | 190 /// Messages are encoded as instances of `ErrorCode` classes where the |
178 /// corresponding class is given by the `category` field of the Message. | 191 /// corresponding class is given by the `category` field of the Message. |
179 /// | 192 /// |
180 /// All instances are stored as top-level const variables. | 193 /// All instances are stored as top-level const variables. |
181 /// | 194 /// |
182 /// A sample output looks as follows: | 195 /// A sample output looks as follows: |
183 /// | 196 /// |
184 /// const FooCategoryErrorCode EXAMPLE_MESSAGE = const FooCategoryErrorCode( | 197 /// const FooCategoryErrorCode EXAMPLE_MESSAGE = const FooCategoryErrorCode( |
185 /// "EXAMPLE_MESSAGE", | 198 /// "EXAMPLE_MESSAGE", |
186 /// "Don't use {0} with {1}", | 199 /// "Don't use {0} with {1}", |
187 /// "Just don't do it"); | 200 /// "Just don't do it"); |
188 void emitAnalyzer() { | 201 void emitAnalyzer() { |
189 var input = MESSAGES; | 202 var input = MESSAGES; |
190 var outPath = io.Platform.script.resolve(analyzerPath).toFilePath(); | 203 var outPath = io.Platform.script.resolve(analyzerPath).toFilePath(); |
191 print("Emitting analyzer:"); | 204 print("Emitting analyzer:"); |
192 print(" Input: ${input.length} entries"); | 205 print(" Input: ${input.length} entries"); |
193 print(" Output: $outPath"); | 206 print(" Output: $outPath"); |
194 | 207 |
195 StringBuffer out = new StringBuffer(); | 208 StringBuffer out = new StringBuffer(); |
196 out.writeln(copyrightHeader); | 209 out.writeln(copyrightHeader); |
197 out.writeln(dontEditWarning); | 210 out.writeln(dontEditWarning); |
198 out.writeln("import 'package:analyzer/src/generated/error.dart';"); | 211 out.writeln("import 'package:analyzer/src/generated/error.dart';"); |
199 out.writeln("import 'package:analyzer/src/generated/parser.dart' " | 212 out.writeln("import 'package:analyzer/src/generated/parser.dart' " |
200 "show ParserErrorCode;"); | 213 "show ParserErrorCode;"); |
201 input.forEach((name, message) { | 214 input.forEach((name, message) { |
202 if (!message.usedBy.contains(Platform.analyzer)) return; | 215 if (!message.usedBy.contains(Platform.analyzer)) return; |
| 216 List<Category> categories = message.categories; |
| 217 bool hasMultipleCategories = categories.length != 1; |
| 218 for (Category category in categories) { |
| 219 String className = category.name + "Code"; |
| 220 String analyzerName = |
| 221 hasMultipleCategories ? "$name${camlToAllCaps(category.name)}" : name; |
| 222 out.writeln(); |
| 223 out.writeln("const $className $analyzerName = const $className("); |
| 224 out.writeln(" '$name',"); |
203 | 225 |
204 Category category = message.category; | 226 String template = message.template; |
205 String className = category.name + "Code"; | 227 List holeOrder = message.templateHoleOrder; |
206 out.writeln(); | 228 String analyzerTemplate = convertToAnalyzerTemplate(template, holeOrder); |
207 out.writeln("const $className $name = const $className("); | 229 out.write(" "); |
208 out.writeln(" '$name',"); | 230 out.write(escapeString(analyzerTemplate)); |
209 | 231 out.write(",\n "); |
210 String template = message.template; | 232 out.write(escapeString(message.howToFix)); |
211 List holeOrder = message.templateHoleOrder; | 233 out.writeln("); // Generated. Don't edit."); |
212 String analyzerTemplate = convertToAnalyzerTemplate(template, holeOrder); | 234 } |
213 out.write(" "); | |
214 out.write(escapeString(analyzerTemplate)); | |
215 out.write(",\n "); | |
216 out.write(escapeString(message.howToFix)); | |
217 out.writeln("); // Generated. Don't edit."); | |
218 }); | 235 }); |
219 | 236 |
220 new io.File(outPath).writeAsStringSync(out.toString()); | 237 new io.File(outPath).writeAsStringSync(out.toString()); |
221 print("Emitting analyzer done."); | 238 print("Emitting analyzer done."); |
222 } | 239 } |
223 | 240 |
224 /// Translates the shared messages in `../lib/shared_messages.dart` to JSON, | 241 /// Translates the shared messages in `../lib/shared_messages.dart` to JSON, |
225 /// dart2js, and analyzer formats. | 242 /// dart2js, and analyzer formats. |
226 /// | 243 /// |
227 /// Emits the json-output to [jsonPath], the dart2js-output to [dart2jsPath], | 244 /// Emits the json-output to [jsonPath], the dart2js-output to [dart2jsPath], |
228 /// and the analyzer-output to [analyzerPath]. | 245 /// and the analyzer-output to [analyzerPath]. |
229 void main() { | 246 void main() { |
230 emitJson(); | 247 emitJson(); |
231 emitDart2js(); | 248 emitDart2js(); |
232 emitAnalyzer(); | 249 emitAnalyzer(); |
233 } | 250 } |
OLD | NEW |