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

Unified Diff: frog/leg/resolver.dart

Issue 9283014: Implement field parameter for generative constructors. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: '' Created 8 years, 11 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: frog/leg/resolver.dart
===================================================================
--- frog/leg/resolver.dart (revision 3542)
+++ frog/leg/resolver.dart (working copy)
@@ -636,6 +636,10 @@
visitNewExpression(NewExpression node) {
if (node.isConst()) cancel(node, 'const expressions are not implemented');
+ if (node.send.selector.asTypeAnnotation() === null) {
+ cancel(
+ node, 'named constructors with type parameters are not implemented');
ahe 2012/01/24 14:28:44 parameters -> arguments.
ngeoffray 2012/01/24 14:57:04 Done.
+ }
visit(node.send.argumentsNode);
@@ -857,14 +861,42 @@
visitNodeList(NodeList node) {
for (Link<Node> link = node.nodes; !link.isEmpty(); link = link.tail) {
SourceString name = visit(link.head);
- VariableElement element = new VariableElement(
- name, variables, kind, resolver.context.element, node: link.head);
- resolver.defineElement(link.head, element);
+ if (name !== null) {
+ VariableElement element = new VariableElement(
+ name, variables, kind, resolver.context.element, node: link.head);
+ resolver.defineElement(link.head, element);
+ }
}
}
visit(Node node) => node.accept(this);
+ visitSend(Node node) {
+ // The lhs is a property access. The parser never accepts this
+ // code right now if it's not a field initializer.
+ if (kind !== ElementKind.PARAMETER || node.receiver === null) {
+ resolver.cancel('internal error');
+ }
+
+ if (resolver.element.kind !== ElementKind.GENERATIVE_CONSTRUCTOR) {
+ resolver.error(node, MessageKind.FIELD_PARAMETER_NOT_ALLOWED, []);
+ } else if (node.receiver.asIdentifier() === null ||
+ !node.receiver.asIdentifier().isThis()) {
+ resolver.error(node, MessageKind.INVALID_FIELD_PARAMETER, []);
+ } else {
+ SourceString name = node.selector.asIdentifier().source;
+ Element field = resolver.currentClass.lookupLocalMember(name);
+ if (field.kind !== ElementKind.FIELD) {
+ resolver.error(node, MessageKind.NOT_A_FIELD, [name]);
+ } else if (!field.isInstanceMember()) {
+ resolver.error(node, MessageKind.NOT_INSTANCE_FIELD, [name]);
+ } else {
+ resolver.defineElement(node, field);
ahe 2012/01/24 14:28:44 I think we should define the element regardlessly.
ngeoffray 2012/01/24 14:57:04 Defining it.
+ }
+ }
+ return null;
+ }
+
visitNode(Node node) {
resolver.cancel(node, 'not implemented');
}
« no previous file with comments | « frog/leg/lib/core.dart ('k') | frog/leg/ssa/builder.dart » ('j') | frog/leg/warnings.dart » ('J')

Powered by Google App Engine
This is Rietveld 408576698