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

Side by Side Diff: lib/compiler/implementation/dart_backend/placeholder_collector.dart

Issue 10920089: Generate a warning and a runtime error for calls to nonexistent static calls, getters and setters. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years, 3 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 class LocalPlaceholder implements Hashable { 5 class LocalPlaceholder implements Hashable {
6 final String identifier; 6 final String identifier;
7 final Set<Node> nodes; 7 final Set<Node> nodes;
8 LocalPlaceholder(this.identifier) : nodes = new Set<Node>(); 8 LocalPlaceholder(this.identifier) : nodes = new Set<Node>();
9 int hashCode() => identifier.hashCode(); 9 int hashCode() => identifier.hashCode();
10 String toString() => 10 String toString() =>
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
52 if (element !== null) { 52 if (element !== null) {
53 collector.tryMakeLocalPlaceholder(element, node.selector); 53 collector.tryMakeLocalPlaceholder(element, node.selector);
54 } 54 }
55 } 55 }
56 56
57 visitGetterSend(Send node) { 57 visitGetterSend(Send node) {
58 final element = elements[node]; 58 final element = elements[node];
59 // element === null means dynamic property access. 59 // element === null means dynamic property access.
60 if (element === null) { 60 if (element === null) {
61 collector.tryMakeMemberPlaceholder(node.selector); 61 collector.tryMakeMemberPlaceholder(node.selector);
62 } else if (element.isErroneous()) {
63 return;
62 } else if (element.isPrefix()) { 64 } else if (element.isPrefix()) {
63 // Node is prefix part in case of source 'lib.somesetter = 5;' 65 // Node is prefix part in case of source 'lib.somesetter = 5;'
64 collector.makeNullPlaceholder(node); 66 collector.makeNullPlaceholder(node);
65 } else if (Elements.isStaticOrTopLevel(element)) { 67 } else if (Elements.isStaticOrTopLevel(element)) {
66 // Unqualified or prefixed top level or static. 68 // Unqualified or prefixed top level or static.
67 collector.makeElementPlaceholder(node.selector, element); 69 collector.makeElementPlaceholder(node.selector, element);
68 } else if (!element.isTopLevel()) { 70 } else if (!element.isTopLevel()) {
69 if (element.isInstanceMember()) { 71 if (element.isInstanceMember()) {
70 collector.tryMakeMemberPlaceholder(node.selector); 72 collector.tryMakeMemberPlaceholder(node.selector);
71 } else { 73 } else {
72 // May get FunctionExpression here in selector 74 // May get FunctionExpression here in selector
73 // in case of A(int this.f()); 75 // in case of A(int this.f());
74 if (node.selector is Identifier) { 76 if (node.selector is Identifier) {
75 collector.tryMakeLocalPlaceholder(element, node.selector); 77 collector.tryMakeLocalPlaceholder(element, node.selector);
76 } else { 78 } else {
77 assert(node.selector is FunctionExpression); 79 assert(node.selector is FunctionExpression);
78 } 80 }
79 } 81 }
80 } 82 }
81 } 83 }
82 84
83 visitStaticSend(Send node) { 85 visitStaticSend(Send node) {
84 final element = elements[node]; 86 final element = elements[node];
87 if (Element.isUnresolved(element)) {
88 return;
89 }
85 if (element.isConstructor() || element.isFactoryConstructor()) { 90 if (element.isConstructor() || element.isFactoryConstructor()) {
86 // Rename named constructor in redirection position: 91 // Rename named constructor in redirection position:
87 // class C { C.named(); C.redirecting() : this.named(); } 92 // class C { C.named(); C.redirecting() : this.named(); }
88 if (node.receiver is Identifier 93 if (node.receiver is Identifier
89 && node.receiver.asIdentifier().isThis()) { 94 && node.receiver.asIdentifier().isThis()) {
90 assert(node.selector is Identifier); 95 assert(node.selector is Identifier);
91 collector.tryMakeMemberPlaceholder(node.selector); 96 collector.tryMakeMemberPlaceholder(node.selector);
92 } 97 }
93 // Field names can be exposed as names of optional arguments, e.g. 98 // Field names can be exposed as names of optional arguments, e.g.
94 // class C { 99 // class C {
(...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after
355 360
356 visitNode(Node node) { node.visitChildren(this); } // We must go deeper. 361 visitNode(Node node) { node.visitChildren(this); } // We must go deeper.
357 362
358 visitSend(Send send) { 363 visitSend(Send send) {
359 new SendVisitor(this, treeElements).visitSend(send); 364 new SendVisitor(this, treeElements).visitSend(send);
360 send.visitChildren(this); 365 send.visitChildren(this);
361 } 366 }
362 367
363 visitSendSet(SendSet send) { 368 visitSendSet(SendSet send) {
364 final element = treeElements[send]; 369 final element = treeElements[send];
365 if (element !== null) { 370 if (!Element.isUnresolved(element)) {
366 if (Elements.isStaticOrTopLevel(element)) { 371 if (Elements.isStaticOrTopLevel(element)) {
367 assert(element is VariableElement || element.isSetter()); 372 assert(element is VariableElement || element.isSetter());
368 makeElementPlaceholder(send.selector, element); 373 makeElementPlaceholder(send.selector, element);
369 } else { 374 } else {
370 assert(send.selector is Identifier); 375 assert(send.selector is Identifier);
371 if (Elements.isInstanceField(element)) { 376 if (Elements.isInstanceField(element)) {
372 tryMakeMemberPlaceholder(send.selector); 377 tryMakeMemberPlaceholder(send.selector);
373 } else { 378 } else {
374 tryMakeLocalPlaceholder(element, send.selector); 379 tryMakeLocalPlaceholder(element, send.selector);
375 } 380 }
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after
563 568
564 visitBlock(Block node) { 569 visitBlock(Block node) {
565 for (Node statement in node.statements.nodes) { 570 for (Node statement in node.statements.nodes) {
566 if (statement is VariableDefinitions) { 571 if (statement is VariableDefinitions) {
567 makeVarDeclarationTypePlaceholder(statement); 572 makeVarDeclarationTypePlaceholder(statement);
568 } 573 }
569 } 574 }
570 node.visitChildren(this); 575 node.visitChildren(this);
571 } 576 }
572 } 577 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698