Chromium Code Reviews| 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; |
|
Johnni Winther
2013/05/08 08:22:08
I'm not sure this works with the current invariant
ahe
2013/05/08 08:57:43
Good you spotted this, then. The problem is that
|
| } |
| 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; |
| } |