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

Side by Side Diff: dart/sdk/lib/_internal/compiler/implementation/scanner/class_element_parser.dart

Issue 11472022: Reject constructor names that conflict with members. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 8 years 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) 2011, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2011, 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 part of scanner; 5 part of scanner;
6 6
7 class ClassElementParser extends PartialParser { 7 class ClassElementParser extends PartialParser {
8 ClassElementParser(Listener listener) : super(listener); 8 ClassElementParser(Listener listener) : super(listener);
9 9
10 Token parseClassBody(Token token) => fullParseClassBody(token); 10 Token parseClassBody(Token token) => fullParseClassBody(token);
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
98 assert(identical(receiver.source.stringValue, 'operator')); 98 assert(identical(receiver.source.stringValue, 'operator'));
99 // TODO(ahe): It is a hack to compare to ')', but it beats 99 // TODO(ahe): It is a hack to compare to ')', but it beats
100 // parsing the node. 100 // parsing the node.
101 bool isUnary = identical(operator.token.next.next.stringValue, ')'); 101 bool isUnary = identical(operator.token.next.next.stringValue, ')');
102 return Elements.constructOperatorName(operator.source, isUnary); 102 return Elements.constructOperatorName(operator.source, isUnary);
103 } else { 103 } else {
104 if (receiver == null) { 104 if (receiver == null) {
105 listener.cancel('library prefix in named factory constructor not ' 105 listener.cancel('library prefix in named factory constructor not '
106 'implemented', node: send.receiver); 106 'implemented', node: send.receiver);
107 } 107 }
108 if (receiver.source != enclosingElement.name) {
109 listener.onDeprecatedFeature(receiver, 'interface factories');
110 }
108 return Elements.constructConstructorName(receiver.source, 111 return Elements.constructConstructorName(receiver.source,
109 selector.source); 112 selector.source);
110 } 113 }
111 } 114 }
112 115
113 void endMethod(Token getOrSet, Token beginToken, Token endToken) { 116 void endMethod(Token getOrSet, Token beginToken, Token endToken) {
114 super.endMethod(getOrSet, beginToken, endToken); 117 super.endMethod(getOrSet, beginToken, endToken);
115 FunctionExpression method = popNode(); 118 FunctionExpression method = popNode();
116 pushNode(null); 119 pushNode(null);
117 bool isConstructor = isConstructorName(method.name); 120 bool isConstructor = isConstructorName(method.name);
(...skipping 12 matching lines...) Expand all
130 new PartialFunctionElement(name, beginToken, getOrSet, endToken, 133 new PartialFunctionElement(name, beginToken, getOrSet, endToken,
131 kind, method.modifiers, enclosingElement); 134 kind, method.modifiers, enclosingElement);
132 addMember(memberElement); 135 addMember(memberElement);
133 } 136 }
134 137
135 void endFactoryMethod(Token beginToken, Token endToken) { 138 void endFactoryMethod(Token beginToken, Token endToken) {
136 super.endFactoryMethod(beginToken, endToken); 139 super.endFactoryMethod(beginToken, endToken);
137 FunctionExpression method = popNode(); 140 FunctionExpression method = popNode();
138 pushNode(null); 141 pushNode(null);
139 SourceString name = getMethodNameHack(method.name); 142 SourceString name = getMethodNameHack(method.name);
143 Identifier singleIdentifierName = method.name.asIdentifier();
144 if (singleIdentifierName != null && singleIdentifierName.source == name) {
145 if (name != enclosingElement.name) {
146 listener.onDeprecatedFeature(method.name, 'interface factories');
147 }
148 }
140 ElementKind kind = ElementKind.FUNCTION; 149 ElementKind kind = ElementKind.FUNCTION;
141 Element memberElement = 150 Element memberElement =
142 new PartialFunctionElement(name, beginToken, null, endToken, 151 new PartialFunctionElement(name, beginToken, null, endToken,
143 kind, method.modifiers, enclosingElement); 152 kind, method.modifiers, enclosingElement);
144 addMember(memberElement); 153 addMember(memberElement);
145 } 154 }
146 155
147 void endFields(int count, Token beginToken, Token endToken) { 156 void endFields(int count, Token beginToken, Token endToken) {
148 super.endFields(count, beginToken, endToken); 157 super.endFields(count, beginToken, endToken);
149 VariableDefinitions variableDefinitions = popNode(); 158 VariableDefinitions variableDefinitions = popNode();
(...skipping 29 matching lines...) Expand all
179 188
180 void endMetadata(Token beginToken, Token periodBeforeName, Token endToken) { 189 void endMetadata(Token beginToken, Token periodBeforeName, Token endToken) {
181 popNode(); // Discard arguments. 190 popNode(); // Discard arguments.
182 if (periodBeforeName != null) { 191 if (periodBeforeName != null) {
183 popNode(); // Discard name. 192 popNode(); // Discard name.
184 } 193 }
185 popNode(); // Discard node (Send or Identifier). 194 popNode(); // Discard node (Send or Identifier).
186 pushMetadata(new PartialMetadataAnnotation(beginToken)); 195 pushMetadata(new PartialMetadataAnnotation(beginToken));
187 } 196 }
188 } 197 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698