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; |
} |