| Index: pkg/smoke/lib/codegen/generator.dart
|
| diff --git a/pkg/smoke/lib/codegen/generator.dart b/pkg/smoke/lib/codegen/generator.dart
|
| index 920462d2d15b55921e51984d30e032b2212dc5e6..a313e5d0588c9c184b9cc113466e959c1f31b1d4 100644
|
| --- a/pkg/smoke/lib/codegen/generator.dart
|
| +++ b/pkg/smoke/lib/codegen/generator.dart
|
| @@ -458,5 +458,38 @@ const DEFAULT_IMPORTS = const [
|
| "useGeneratedCode, StaticConfiguration;",
|
| ];
|
|
|
| -_symbol(String name) =>
|
| - name.contains('[') ? "const Symbol('$name')" : '#$name';
|
| +_symbol(String name) {
|
| + if (!_publicSymbolPattern.hasMatch(name)) {
|
| + throw new StateError('invalid symbol name: "$name"');
|
| + }
|
| + return _literalSymbolPattern.hasMatch(name)
|
| + ? '#$name' : "const Symbol('$name')";
|
| +}
|
| +
|
| +// TODO(sigmund): is this included in some library we can import? I derived the
|
| +// definitions below from sdk/lib/internal/symbol.dart.
|
| +
|
| +/// Reserved words in Dart.
|
| +const String _reservedWordRE =
|
| + r'(?:assert|break|c(?:a(?:se|tch)|lass|on(?:st|tinue))|d(?:efault|o)|'
|
| + r'e(?:lse|num|xtends)|f(?:alse|inal(?:ly)?|or)|i[fns]|n(?:ew|ull)|'
|
| + r'ret(?:hrow|urn)|s(?:uper|witch)|t(?:h(?:is|row)|r(?:ue|y))|'
|
| + r'v(?:ar|oid)|w(?:hile|ith))';
|
| +
|
| +/// Public identifier: a valid identifier (not a reserved word) that doesn't
|
| +/// start with '_'.
|
| +const String _publicIdentifierRE =
|
| + r'(?!' '$_reservedWordRE' r'\b(?!\$))[a-zA-Z$][\w$]*';
|
| +
|
| +/// Pattern that matches operators only.
|
| +final RegExp _literalSymbolPattern = new RegExp(
|
| + '^(?:$_publicIdentifierRE(?:\$|[.](?!\$)))+?\$');
|
| +
|
| +/// Operator names allowed as symbols. The name of the oeprators is the same as
|
| +/// the operator itself except for unary minus, where the name is "unary-".
|
| +const String _operatorRE =
|
| + r'(?:[\-+*/%&|^]|\[\]=?|==|~/?|<[<=]?|>[>=]?|unary-)';
|
| +
|
| +/// Pattern that matches public symbols.
|
| +final RegExp _publicSymbolPattern = new RegExp(
|
| + '^(?:$_operatorRE\$|$_publicIdentifierRE(?:=?\$|[.](?!\$)))+?\$');
|
|
|