OLD | NEW |
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, 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 // TODO(jmesserly): this was ported from package:dev_compiler, and needs to be | 5 // TODO(jmesserly): this was ported from package:dev_compiler, and needs to be |
6 // refactored to fit into analyzer. | 6 // refactored to fit into analyzer. |
7 library analyzer.src.task.strong.checker; | 7 library analyzer.src.task.strong.checker; |
8 | 8 |
9 import 'package:analyzer/analyzer.dart'; | 9 import 'package:analyzer/analyzer.dart'; |
10 import 'package:analyzer/dart/ast/ast.dart'; | 10 import 'package:analyzer/dart/ast/ast.dart'; |
(...skipping 1271 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1282 // current class against definitions here and in superclasses. | 1282 // current class against definitions here and in superclasses. |
1283 var localInterfaces = new Set<InterfaceType>(); | 1283 var localInterfaces = new Set<InterfaceType>(); |
1284 var type = element.type; | 1284 var type = element.type; |
1285 type.interfaces.forEach((i) => find(i, localInterfaces)); | 1285 type.interfaces.forEach((i) => find(i, localInterfaces)); |
1286 _checkInterfacesOverrides(type, localInterfaces, seen, | 1286 _checkInterfacesOverrides(type, localInterfaces, seen, |
1287 includeParents: true, classNode: node); | 1287 includeParents: true, classNode: node); |
1288 | 1288 |
1289 // Check also how we override locally the interfaces from parent classes if | 1289 // Check also how we override locally the interfaces from parent classes if |
1290 // the parent class is abstract. Otherwise, these will be checked as | 1290 // the parent class is abstract. Otherwise, these will be checked as |
1291 // overrides on the concrete superclass. | 1291 // overrides on the concrete superclass. |
| 1292 // We detect superclass circularities using the "tortoise and hare" |
| 1293 // algorithm. |
1292 var superInterfaces = new Set<InterfaceType>(); | 1294 var superInterfaces = new Set<InterfaceType>(); |
1293 var parent = type.superclass; | 1295 var parent = type.superclass; |
| 1296 var hare = type.superclass?.superclass; |
1294 // TODO(sigmund): we don't seem to be reporting the analyzer error that a | 1297 // TODO(sigmund): we don't seem to be reporting the analyzer error that a |
1295 // non-abstract class is not implementing an interface. See | 1298 // non-abstract class is not implementing an interface. See |
1296 // https://github.com/dart-lang/dart-dev-compiler/issues/25 | 1299 // https://github.com/dart-lang/dart-dev-compiler/issues/25 |
1297 while (parent != null && parent.element.isAbstract) { | 1300 while (parent != null && parent.element.isAbstract) { |
| 1301 if (identical(parent, hare)) break; |
1298 parent.interfaces.forEach((i) => find(i, superInterfaces)); | 1302 parent.interfaces.forEach((i) => find(i, superInterfaces)); |
1299 parent = parent.superclass; | 1303 parent = parent.superclass; |
| 1304 hare = hare?.superclass?.superclass; |
1300 } | 1305 } |
1301 _checkInterfacesOverrides(type, superInterfaces, seen, | 1306 _checkInterfacesOverrides(type, superInterfaces, seen, |
1302 includeParents: false, classNode: node); | 1307 includeParents: false, classNode: node); |
1303 } | 1308 } |
1304 | 1309 |
1305 /// Check that individual methods and fields in [node] correctly override | 1310 /// Check that individual methods and fields in [node] correctly override |
1306 /// the declarations in [baseType]. | 1311 /// the declarations in [baseType]. |
1307 /// | 1312 /// |
1308 /// The [errorLocation] node indicates where errors are reported, see | 1313 /// The [errorLocation] node indicates where errors are reported, see |
1309 /// [_checkSingleOverride] for more details. | 1314 /// [_checkSingleOverride] for more details. |
(...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1595 } | 1600 } |
1596 | 1601 |
1597 /// If node is a [ClassDeclaration] returns its members, otherwise if node is | 1602 /// If node is a [ClassDeclaration] returns its members, otherwise if node is |
1598 /// a [ClassTypeAlias] this returns an empty list. | 1603 /// a [ClassTypeAlias] this returns an empty list. |
1599 WithClause _withClause(Declaration node) { | 1604 WithClause _withClause(Declaration node) { |
1600 return node is ClassDeclaration | 1605 return node is ClassDeclaration |
1601 ? node.withClause | 1606 ? node.withClause |
1602 : (node as ClassTypeAlias).withClause; | 1607 : (node as ClassTypeAlias).withClause; |
1603 } | 1608 } |
1604 } | 1609 } |
OLD | NEW |