Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1818)

Unified Diff: dart/sdk/lib/_internal/compiler/implementation/resolution/members.dart

Issue 14079003: Implement Symbol correctly in dart2js. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge
Patch Set: Address review comments Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..b3c8fd2d6d377dc4e4a3483bd149018d7e6fd3fc 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.
@@ -696,6 +697,7 @@ class ResolverTask extends CompilerTask {
if (compiler.onDeprecatedFeature(member, 'conflicting constructor')) {
compiler.reportMessage(
compiler.spanFromElement(otherMember),
+ // Using GENERIC as this message is temporary.
MessageKind.GENERIC.error({'text': 'This member conflicts with a'
' constructor.'}),
Diagnostic.INFO);
@@ -1619,6 +1621,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
@@ -1982,6 +2009,7 @@ class ResolverVisitor extends CommonResolverVisitor<Element> {
Element target;
SourceString name = node.selector.asIdentifier().source;
if (identical(name.stringValue, 'this')) {
+ // TODO(ahe): Why is this using GENERIC?
error(node.selector, MessageKind.GENERIC,
{'text': "expected an identifier"});
} else if (node.isSuperCall) {
@@ -2162,6 +2190,13 @@ class ResolverVisitor extends CommonResolverVisitor<Element> {
Element target = resolveSend(node);
sendIsMemberAccess = oldSendIsMemberAccess;
+ if (target != null && target == compiler.mirrorSystemGetNameFunction) {
+ compiler.reportWarningCode(
+ node.selector, MessageKind.STATIC_FUNCTION_BLOAT,
+ {'class': compiler.mirrorSystemClass.name,
+ 'name': compiler.mirrorSystemGetNameFunction.name});
+ }
+
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,11 @@ 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.
+ assert(invariant(node, compiler.symbolValidatedConstructor != null));
+ world.registerStaticUse(compiler.symbolValidatedConstructor);
+ }
}
visitThrow(Throw node) {
@@ -2490,6 +2531,12 @@ 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) {
+ compiler.reportWarningCode(
+ node.newToken, MessageKind.NON_CONST_BLOAT,
+ {'name': compiler.symbolClass.name});
+ }
resolveSelector(node.send);
resolveArguments(node.send.argumentsNode);
useElement(node.send, constructor);
@@ -2532,9 +2579,37 @@ 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()) {
+ DartType type = name.computeType(compiler);
+ compiler.reportErrorCode(argumentNode, MessageKind.STRING_EXPECTED,
+ {'type': type});
+ } 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.PRIVATE_IDENTIFIER,
+ {'value': name});
+ return;
+ }
+ if (!symbolValidationPattern.hasMatch(name)) {
+ compiler.reportErrorCode(node, MessageKind.INVALID_SYMBOL,
+ {'value': name});
+ }
+ }
+
+
/**
* Try to resolve the constructor that is referred to by [node].
* Note: this function may return an ErroneousFunctionElement instead of

Powered by Google App Engine
This is Rietveld 408576698