OLD | NEW |
---|---|
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 interface TreeElements { | 5 interface TreeElements { |
6 Element operator[](Node node); | 6 Element operator[](Node node); |
7 Selector getSelector(Send send); | 7 Selector getSelector(Send send); |
8 Type getType(TypeAnnotation annotation); | 8 Type getType(TypeAnnotation annotation); |
9 } | 9 } |
10 | 10 |
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
222 } | 222 } |
223 | 223 |
224 void resolveClass(ClassElement element) { | 224 void resolveClass(ClassElement element) { |
225 if (element.isResolved) return; | 225 if (element.isResolved) return; |
226 measure(() { | 226 measure(() { |
227 ClassNode tree = element.parseNode(compiler); | 227 ClassNode tree = element.parseNode(compiler); |
228 ClassResolverVisitor visitor = | 228 ClassResolverVisitor visitor = |
229 new ClassResolverVisitor(compiler, element.getLibrary(), element); | 229 new ClassResolverVisitor(compiler, element.getLibrary(), element); |
230 visitor.visit(tree); | 230 visitor.visit(tree); |
231 element.isResolved = true; | 231 element.isResolved = true; |
232 | |
233 while (!toResolve.isEmpty()) { | |
234 ClassElement classElement = toResolve.removeFirst(); | |
235 classElement.ensureResolved(compiler); | |
236 } | |
237 | |
238 checkOverrides(element); | |
232 }); | 239 }); |
233 } | 240 } |
234 | 241 |
242 checkOverrides(ClassElement cls) { | |
243 if (cls === compiler.objectClass) return; | |
244 cls.forEachMember((holder, member) { | |
245 Element superMember = cls.lookupSuperMember(member.name); | |
246 if (superMember !== null) { | |
247 if (member.modifiers.isStatic()) { | |
248 compiler.cancel('Static members cannot override', element: member); | |
249 } else { | |
250 FunctionElement superFunction = superMember.asFunctionElement(); | |
251 FunctionElement function = member.asFunctionElement(); | |
252 if (superFunction === null || superFunction.isAccessor()) { | |
253 // Field or accessor in super. | |
254 if (function !== null && !function.isAccessor()) { | |
255 // But a plain method in this class. | |
256 compiler.cancel('Cannot override field with method', | |
257 element: member); | |
258 } | |
259 } else { | |
260 // Instance method in super. | |
261 if (function === null || function.isAccessor()) { | |
262 // But a field in this class. | |
karlklose
2012/06/20 13:51:31
... or accessor ...?
ahe
2012/06/22 12:50:33
Done.
| |
263 compiler.cancel('Cannot override method with field', | |
264 element: member); | |
265 } else { | |
266 // Both are plain instance methods. | |
267 if (superFunction.requiredParameterCount(compiler) != | |
268 function.requiredParameterCount(compiler)) { | |
269 compiler.cancel('Bad override', element: member); | |
270 } | |
271 // TODO(ahe): Check optional parameters. | |
272 } | |
273 } | |
274 } | |
275 } | |
276 }); | |
277 } | |
278 | |
235 FunctionSignature resolveSignature(FunctionElement element) { | 279 FunctionSignature resolveSignature(FunctionElement element) { |
236 return compiler.withCurrentElement(element, () { | 280 return compiler.withCurrentElement(element, () { |
237 FunctionExpression node = | 281 FunctionExpression node = |
238 compiler.parser.measure(() => element.parseNode(compiler)); | 282 compiler.parser.measure(() => element.parseNode(compiler)); |
239 return measure(() => SignatureResolver.analyze( | 283 return measure(() => SignatureResolver.analyze( |
240 compiler, node.parameters, node.returnType, element)); | 284 compiler, node.parameters, node.returnType, element)); |
241 }); | 285 }); |
242 } | 286 } |
243 | 287 |
244 FunctionSignature resolveTypedef(TypedefElement element) { | 288 FunctionSignature resolveTypedef(TypedefElement element) { |
(...skipping 1848 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2093 | 2137 |
2094 TopScope(LibraryElement library) : super(null, library); | 2138 TopScope(LibraryElement library) : super(null, library); |
2095 Element lookup(SourceString name) { | 2139 Element lookup(SourceString name) { |
2096 return library.find(name); | 2140 return library.find(name); |
2097 } | 2141 } |
2098 | 2142 |
2099 Element add(Element newElement) { | 2143 Element add(Element newElement) { |
2100 throw "Cannot add an element in the top scope"; | 2144 throw "Cannot add an element in the top scope"; |
2101 } | 2145 } |
2102 } | 2146 } |
OLD | NEW |