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 6e26ddbf4b4549ebfc5b17ec729fdaa717628077..c22388b95db7033c143e2017c03be5a223cbb103 100644 |
| --- a/dart/sdk/lib/_internal/compiler/implementation/resolution/members.dart |
| +++ b/dart/sdk/lib/_internal/compiler/implementation/resolution/members.dart |
| @@ -545,6 +545,7 @@ class ResolverTask extends CompilerTask { |
| new ClassResolverVisitor(compiler, element); |
| visitor.visit(tree); |
| element.resolutionState = STATE_DONE; |
| + compiler.onClassResolved(element); |
| })); |
| if (element.isPatched) { |
| // Ensure handling patch after origin. |
| @@ -1619,6 +1620,31 @@ class ResolverVisitor extends CommonResolverVisitor<Element> { |
| int allowedCategory = ElementCategory.VARIABLE | ElementCategory.FUNCTION |
| | ElementCategory.IMPLIES_TYPE; |
| + // TODO(ahe): Find a way to share this with runtime implementation. |
| + static final RegExp symbolValidationPattern = |
| + new RegExp(r'^(?:[a-zA-Z$][a-zA-Z$0-9_]*\.)*(?:[a-zA-Z$][a-zA-Z$0-9_]*=?|' |
| + r'-|' |
| + r'unary-|' |
| + r'\[\]=|' |
| + r'~|' |
| + r'==|' |
| + r'\[\]|' |
| + r'\*|' |
| + r'/|' |
| + r'%|' |
| + r'~/|' |
| + r'\+|' |
| + r'<<|' |
| + r'>>|' |
| + r'>=|' |
| + r'>|' |
| + r'<=|' |
| + r'<|' |
| + r'&|' |
| + r'\^|' |
| + r'\|' |
| + r')$'); |
| + |
| ResolverVisitor(Compiler compiler, Element element, this.mapping) |
| : this.enclosingElement = element, |
| // When the element is a field, we are actually resolving its |
| @@ -2162,6 +2188,15 @@ class ResolverVisitor extends CommonResolverVisitor<Element> { |
| Element target = resolveSend(node); |
| sendIsMemberAccess = oldSendIsMemberAccess; |
| + if (target != null && target == compiler.mirrorSystemGetNameFunction) { |
| + compiler.reportWarningCode( |
| + node.selector, MessageKind.GENERIC, |
|
ahe
2013/04/18 11:34:44
Will provide real MessageKind before submitting.
|
| + {'text': 'Warning: using ' |
| + '"${compiler.mirrorSystemClass.name.slowToString()}.' |
| + '${compiler.mirrorSystemGetNameFunction.name.slowToString()}" ' |
| + 'will increase the size of compiled code.'}); |
| + } |
| + |
| if (!Elements.isUnresolved(target)) { |
| if (target.isAbstractField()) { |
| AbstractFieldElement field = target; |
| @@ -2411,6 +2446,7 @@ class ResolverVisitor extends CommonResolverVisitor<Element> { |
| } |
| void handleRedirectingFactoryBody(Return node) { |
| + final isSymbolConstructor = enclosingElement == compiler.symbolConstructor; |
| if (!enclosingElement.isFactoryConstructor()) { |
| compiler.reportErrorCode( |
| node, MessageKind.FACTORY_REDIRECTION_IN_NON_FACTORY); |
| @@ -2445,6 +2481,12 @@ class ResolverVisitor extends CommonResolverVisitor<Element> { |
| world.registerStaticUse(redirectionTarget); |
| world.registerInstantiatedClass( |
| redirectionTarget.enclosingElement.declaration, mapping); |
| + if (isSymbolConstructor) { |
| + // Make sure that collection_dev.Symbol.validated is registered. |
| + // TODO(ahe): Don't simply use head. |
|
ahe
2013/04/18 11:34:44
Will fix before submitting.
|
| + world.registerStaticUse( |
| + redirectionTarget.enclosingElement.constructors.head); |
| + } |
| } |
| visitThrow(Throw node) { |
| @@ -2490,6 +2532,14 @@ class ResolverVisitor extends CommonResolverVisitor<Element> { |
| visitNewExpression(NewExpression node) { |
| Node selector = node.send.selector; |
| FunctionElement constructor = resolveConstructor(node); |
| + final bool isSymbolConstructor = constructor == compiler.symbolConstructor; |
| + if (!node.isConst() && isSymbolConstructor) { |
| + String name = compiler.symbolClass.name.slowToString(); |
| + compiler.reportWarningCode( |
| + node.newToken, MessageKind.GENERIC, |
|
ahe
2013/04/18 11:34:44
Will provide real MessageKind before submitting.
|
| + {'text': 'Warning: using "new $name" will increase the size of ' |
| + 'compiled code. Use "const $name" if possible.'}); |
| + } |
| resolveSelector(node.send); |
| resolveArguments(node.send.argumentsNode); |
| useElement(node.send, constructor); |
| @@ -2532,9 +2582,39 @@ class ResolverVisitor extends CommonResolverVisitor<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()) { |
| + compiler.reportErrorCode(argumentNode, MessageKind.GENERIC, |
|
ahe
2013/04/18 11:34:44
Will provide real MessageKind before submitting.
|
| + {'text': 'Not a string'}); |
| + } else { |
| + validateSymbol(argumentNode, name.toDartString().slowToString()); |
| + } |
| + } |
| + |
| return null; |
| } |
| + void validateSymbol(Node node, String name) { |
| + if (name.isEmpty) return; |
| + if (name.startsWith('_')) { |
| + compiler.reportErrorCode(node, MessageKind.GENERIC, |
|
ahe
2013/04/18 11:34:44
Will provide real MessageKind before submitting.
|
| + {'text': '"$name" is a private identifier.'}); |
| + return; |
| + } |
| + if (!symbolValidationPattern.hasMatch(name)) { |
| + // TODO(ahe): Better error message. |
| + compiler.reportErrorCode( |
| + node, MessageKind.GENERIC, |
|
ahe
2013/04/18 11:34:44
Will provide real MessageKind before submitting.
|
| + {'text': |
| + '"$name" must be a library name, operator name, or identifier.'}); |
| + } |
| + } |
| + |
| + |
| /** |
| * Try to resolve the constructor that is referred to by [node]. |
| * Note: this function may return an ErroneousFunctionElement instead of |