| Index: dart/sdk/lib/_internal/compiler/implementation/resolution/members.dart
|
| diff --git a/dart/sdk/lib/_internal/compiler/implementation/resolution/members.dart b/dart/sdk/lib/_internal/compiler/implementation/resolution/members.dart
|
| index 49cd0f9b640050980c9730123a300f76a2a54580..8d9c593ec79da5fe89d828a774d5cc34f8087f44 100644
|
| --- a/dart/sdk/lib/_internal/compiler/implementation/resolution/members.dart
|
| +++ b/dart/sdk/lib/_internal/compiler/implementation/resolution/members.dart
|
| @@ -1553,7 +1553,7 @@ abstract class MappingVisitor<T> extends CommonResolverVisitor<T> {
|
|
|
| Element useElement(Node node, Element element) {
|
| if (element == null) return null;
|
| - return mapping[node] = element;
|
| + return mapping[node] = element.declaration;
|
| }
|
|
|
| DartType useType(TypeAnnotation annotation, DartType type) {
|
| @@ -2499,11 +2499,6 @@ class ResolverVisitor extends MappingVisitor<Element> {
|
| Node selector = node.send.selector;
|
| FunctionElement constructor = resolveConstructor(node);
|
| final bool isSymbolConstructor = constructor == compiler.symbolConstructor;
|
| - if (!node.isConst() && isSymbolConstructor) {
|
| - compiler.reportWarningCode(
|
| - node.newToken, MessageKind.NON_CONST_BLOAT,
|
| - {'name': compiler.symbolClass.name});
|
| - }
|
| resolveSelector(node.send, constructor);
|
| resolveArguments(node.send.argumentsNode);
|
| useElement(node.send, constructor);
|
| @@ -2535,35 +2530,46 @@ class ResolverVisitor extends MappingVisitor<Element> {
|
| includeBackendMembers: false,
|
| includeSuperMembers: true);
|
|
|
| - if (node.isConst() && isSymbolConstructor) {
|
| - Node argumentNode = node.send.arguments.head;
|
| - Constant name = compiler.metadataHandler.compileNodeWithDefinitions(
|
| - argumentNode, mapping, isConst: true);
|
| - if (!name.isString()) {
|
| - DartType type = name.computeType(compiler);
|
| - compiler.reportErrorCode(argumentNode, MessageKind.STRING_EXPECTED,
|
| - {'type': type});
|
| + if (isSymbolConstructor) {
|
| + if (node.isConst()) {
|
| + Node argumentNode = node.send.arguments.head;
|
| + Constant name = compiler.metadataHandler.compileNodeWithDefinitions(
|
| + argumentNode, mapping, isConst: true);
|
| + if (!name.isString()) {
|
| + DartType type = name.computeType(compiler);
|
| + compiler.reportErrorCode(argumentNode, MessageKind.STRING_EXPECTED,
|
| + {'type': type});
|
| + } else {
|
| + StringConstant stringConstant = name;
|
| + String nameString = stringConstant.toDartString().slowToString();
|
| + if (validateSymbol(argumentNode, nameString)) {
|
| + world.registerConstSymbol(nameString, mapping);
|
| + }
|
| + }
|
| } else {
|
| - StringConstant stringConstant = name;
|
| - validateSymbol(argumentNode,
|
| - stringConstant.toDartString().slowToString());
|
| + compiler.reportWarningCode(
|
| + node.newToken, MessageKind.NON_CONST_BLOAT,
|
| + {'name': compiler.symbolClass.name});
|
| + world.registerNewSymbol(mapping);
|
| }
|
| }
|
|
|
| return null;
|
| }
|
|
|
| - void validateSymbol(Node node, String name) {
|
| - if (name.isEmpty) return;
|
| + bool validateSymbol(Node node, String name) {
|
| + if (name.isEmpty) return true;
|
| if (name.startsWith('_')) {
|
| compiler.reportErrorCode(node, MessageKind.PRIVATE_IDENTIFIER,
|
| {'value': name});
|
| - return;
|
| + return false;
|
| }
|
| if (!symbolValidationPattern.hasMatch(name)) {
|
| compiler.reportErrorCode(node, MessageKind.INVALID_SYMBOL,
|
| {'value': name});
|
| + return false;
|
| }
|
| + return true;
|
| }
|
|
|
|
|
|
|