| OLD | NEW |
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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 library kernel.type_algebra; | 4 library kernel.type_algebra; |
| 5 | 5 |
| 6 import 'ast.dart'; | 6 import 'ast.dart'; |
| 7 | 7 |
| 8 /// Returns a type where all occurrences of the given type parameters have been | 8 /// Returns a type where all occurrences of the given type parameters have been |
| 9 /// replaced with the corresponding types. | 9 /// replaced with the corresponding types. |
| 10 /// | 10 /// |
| (...skipping 347 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 358 if (useCounter == before) return node; | 358 if (useCounter == before) return node; |
| 359 return new NamedType(node.name, type); | 359 return new NamedType(node.name, type); |
| 360 } | 360 } |
| 361 | 361 |
| 362 DartType visit(DartType node) => node.accept(this); | 362 DartType visit(DartType node) => node.accept(this); |
| 363 | 363 |
| 364 DartType visitInvalidType(InvalidType node) => node; | 364 DartType visitInvalidType(InvalidType node) => node; |
| 365 DartType visitDynamicType(DynamicType node) => node; | 365 DartType visitDynamicType(DynamicType node) => node; |
| 366 DartType visitVoidType(VoidType node) => node; | 366 DartType visitVoidType(VoidType node) => node; |
| 367 DartType visitBottomType(BottomType node) => node; | 367 DartType visitBottomType(BottomType node) => node; |
| 368 DartType visitVector(VectorType node) => node; |
| 368 | 369 |
| 369 DartType visitInterfaceType(InterfaceType node) { | 370 DartType visitInterfaceType(InterfaceType node) { |
| 370 if (node.typeArguments.isEmpty) return node; | 371 if (node.typeArguments.isEmpty) return node; |
| 371 int before = useCounter; | 372 int before = useCounter; |
| 372 var typeArguments = node.typeArguments.map(visit).toList(); | 373 var typeArguments = node.typeArguments.map(visit).toList(); |
| 373 if (useCounter == before) return node; | 374 if (useCounter == before) return node; |
| 374 return new InterfaceType(node.classNode, typeArguments); | 375 return new InterfaceType(node.classNode, typeArguments); |
| 375 } | 376 } |
| 376 | 377 |
| 377 List<TypeParameter> freshTypeParameters(List<TypeParameter> parameters) { | 378 List<TypeParameter> freshTypeParameters(List<TypeParameter> parameters) { |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 532 } | 533 } |
| 533 | 534 |
| 534 bool _unify(DartType type1, DartType type2) { | 535 bool _unify(DartType type1, DartType type2) { |
| 535 if (!success) return false; | 536 if (!success) return false; |
| 536 type1 = type1 is TypeParameterType ? _substituteHead(type1) : type1; | 537 type1 = type1 is TypeParameterType ? _substituteHead(type1) : type1; |
| 537 type2 = type2 is TypeParameterType ? _substituteHead(type2) : type2; | 538 type2 = type2 is TypeParameterType ? _substituteHead(type2) : type2; |
| 538 if (type1 is DynamicType && type2 is DynamicType) return true; | 539 if (type1 is DynamicType && type2 is DynamicType) return true; |
| 539 if (type1 is VoidType && type2 is VoidType) return true; | 540 if (type1 is VoidType && type2 is VoidType) return true; |
| 540 if (type1 is InvalidType && type2 is InvalidType) return true; | 541 if (type1 is InvalidType && type2 is InvalidType) return true; |
| 541 if (type1 is BottomType && type2 is BottomType) return true; | 542 if (type1 is BottomType && type2 is BottomType) return true; |
| 543 if (type1 is VectorType && type2 is VectorType) return true; |
| 542 if (type1 is InterfaceType && type2 is InterfaceType) { | 544 if (type1 is InterfaceType && type2 is InterfaceType) { |
| 543 if (type1.classNode != type2.classNode) return _fail(); | 545 if (type1.classNode != type2.classNode) return _fail(); |
| 544 assert(type1.typeArguments.length == type2.typeArguments.length); | 546 assert(type1.typeArguments.length == type2.typeArguments.length); |
| 545 for (int i = 0; i < type1.typeArguments.length; ++i) { | 547 for (int i = 0; i < type1.typeArguments.length; ++i) { |
| 546 if (!_unify(type1.typeArguments[i], type2.typeArguments[i])) { | 548 if (!_unify(type1.typeArguments[i], type2.typeArguments[i])) { |
| 547 return false; | 549 return false; |
| 548 } | 550 } |
| 549 } | 551 } |
| 550 return true; | 552 return true; |
| 551 } | 553 } |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 640 | 642 |
| 641 bool visit(DartType node) => node.accept(this); | 643 bool visit(DartType node) => node.accept(this); |
| 642 | 644 |
| 643 bool visitNamedType(NamedType node) { | 645 bool visitNamedType(NamedType node) { |
| 644 return visit(node.type); | 646 return visit(node.type); |
| 645 } | 647 } |
| 646 | 648 |
| 647 bool visitInvalidType(InvalidType node) => false; | 649 bool visitInvalidType(InvalidType node) => false; |
| 648 bool visitDynamicType(DynamicType node) => false; | 650 bool visitDynamicType(DynamicType node) => false; |
| 649 bool visitVoidType(VoidType node) => false; | 651 bool visitVoidType(VoidType node) => false; |
| 652 bool visitVectorType(VectorType node) => false; |
| 650 | 653 |
| 651 bool visitInterfaceType(InterfaceType node) { | 654 bool visitInterfaceType(InterfaceType node) { |
| 652 return node.typeArguments.any(visit); | 655 return node.typeArguments.any(visit); |
| 653 } | 656 } |
| 654 | 657 |
| 655 bool visitFunctionType(FunctionType node) { | 658 bool visitFunctionType(FunctionType node) { |
| 656 return node.typeParameters.any(handleTypeParameter) || | 659 return node.typeParameters.any(handleTypeParameter) || |
| 657 node.positionalParameters.any(visit) || | 660 node.positionalParameters.any(visit) || |
| 658 node.namedParameters.any(visitNamedType) || | 661 node.namedParameters.any(visitNamedType) || |
| 659 visit(node.returnType); | 662 visit(node.returnType); |
| 660 } | 663 } |
| 661 | 664 |
| 662 bool visitTypeParameterType(TypeParameterType node) { | 665 bool visitTypeParameterType(TypeParameterType node) { |
| 663 return variables == null || variables.contains(node.parameter); | 666 return variables == null || variables.contains(node.parameter); |
| 664 } | 667 } |
| 665 | 668 |
| 666 bool handleTypeParameter(TypeParameter node) { | 669 bool handleTypeParameter(TypeParameter node) { |
| 667 assert(!variables.contains(node)); | 670 assert(!variables.contains(node)); |
| 668 return node.bound.accept(this); | 671 return node.bound.accept(this); |
| 669 } | 672 } |
| 670 } | 673 } |
| OLD | NEW |