OLD | NEW |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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 /// Library to generate code that can initialize the `StaticConfiguration` in | 5 /// Library to generate code that can initialize the `StaticConfiguration` in |
6 /// `package:smoke/static.dart`. | 6 /// `package:smoke/static.dart`. |
7 /// | 7 /// |
8 /// This library doesn't have any specific logic to extract information from | 8 /// This library doesn't have any specific logic to extract information from |
9 /// Dart source code. To extract code using the analyzer, take a look at the | 9 /// Dart source code. To extract code using the analyzer, take a look at the |
10 /// `smoke.codegen.recorder` library. | 10 /// `smoke.codegen.recorder` library. |
(...skipping 440 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
451 int get hashCode => super.hashCode; | 451 int get hashCode => super.hashCode; |
452 } | 452 } |
453 | 453 |
454 /// Default set of imports added by [SmokeCodeGenerator]. | 454 /// Default set of imports added by [SmokeCodeGenerator]. |
455 const DEFAULT_IMPORTS = const [ | 455 const DEFAULT_IMPORTS = const [ |
456 "import 'package:smoke/smoke.dart' show Declaration, PROPERTY, METHOD;", | 456 "import 'package:smoke/smoke.dart' show Declaration, PROPERTY, METHOD;", |
457 "import 'package:smoke/static.dart' show " | 457 "import 'package:smoke/static.dart' show " |
458 "useGeneratedCode, StaticConfiguration;", | 458 "useGeneratedCode, StaticConfiguration;", |
459 ]; | 459 ]; |
460 | 460 |
461 _symbol(String name) => | 461 _symbol(String name) { |
462 name.contains('[') ? "const Symbol('$name')" : '#$name'; | 462 if (!_publicSymbolPattern.hasMatch(name)) { |
| 463 throw new StateError('invalid symbol name: "$name"'); |
| 464 } |
| 465 return _literalSymbolPattern.hasMatch(name) |
| 466 ? '#$name' : "const Symbol('$name')"; |
| 467 } |
| 468 |
| 469 // TODO(sigmund): is this included in some library we can import? I derived the |
| 470 // definitions below from sdk/lib/internal/symbol.dart. |
| 471 |
| 472 /// Reserved words in Dart. |
| 473 const String _reservedWordRE = |
| 474 r'(?:assert|break|c(?:a(?:se|tch)|lass|on(?:st|tinue))|d(?:efault|o)|' |
| 475 r'e(?:lse|num|xtends)|f(?:alse|inal(?:ly)?|or)|i[fns]|n(?:ew|ull)|' |
| 476 r'ret(?:hrow|urn)|s(?:uper|witch)|t(?:h(?:is|row)|r(?:ue|y))|' |
| 477 r'v(?:ar|oid)|w(?:hile|ith))'; |
| 478 |
| 479 /// Public identifier: a valid identifier (not a reserved word) that doesn't |
| 480 /// start with '_'. |
| 481 const String _publicIdentifierRE = |
| 482 r'(?!' '$_reservedWordRE' r'\b(?!\$))[a-zA-Z$][\w$]*'; |
| 483 |
| 484 /// Pattern that matches operators only. |
| 485 final RegExp _literalSymbolPattern = new RegExp( |
| 486 '^(?:$_publicIdentifierRE(?:\$|[.](?!\$)))+?\$'); |
| 487 |
| 488 /// Operator names allowed as symbols. The name of the oeprators is the same as |
| 489 /// the operator itself except for unary minus, where the name is "unary-". |
| 490 const String _operatorRE = |
| 491 r'(?:[\-+*/%&|^]|\[\]=?|==|~/?|<[<=]?|>[>=]?|unary-)'; |
| 492 |
| 493 /// Pattern that matches public symbols. |
| 494 final RegExp _publicSymbolPattern = new RegExp( |
| 495 '^(?:$_operatorRE\$|$_publicIdentifierRE(?:=?\$|[.](?!\$)))+?\$'); |
OLD | NEW |