| // Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| import 'package:kernel/ast.dart'; |
| |
| testEquals(Constant a, Constant b) { |
| if (a != b) { |
| throw 'Expected $a and $b to be equal.'; |
| } |
| if (a.hashCode != b.hashCode) { |
| throw 'Expected $a and $b hash codes to be equal.'; |
| } |
| } |
| |
| testNotEquals(Constant a, Constant b) { |
| if (a == b) { |
| throw 'Expected $a and $b to be not equal.'; |
| } |
| } |
| |
| main() { |
| Uri uri = Uri.parse('test:uri'); |
| Procedure procedure1 = new Procedure( |
| new Name('foo'), ProcedureKind.Method, new FunctionNode(null), |
| fileUri: uri, isStatic: true); |
| Procedure procedure2 = new Procedure( |
| new Name('foo'), ProcedureKind.Method, new FunctionNode(null), |
| fileUri: uri, isStatic: true); |
| Procedure procedure3 = new Procedure( |
| new Name('foo'), |
| ProcedureKind.Method, |
| new FunctionNode(null, typeParameters: [ |
| new TypeParameter('X', const DynamicType(), const DynamicType()) |
| ]), |
| fileUri: uri, |
| isStatic: true); |
| |
| Class cls = new Class(name: 'Class', fileUri: uri); |
| Procedure factory = new Procedure( |
| new Name('foo'), ProcedureKind.Factory, new FunctionNode(null), |
| fileUri: uri, isStatic: true); |
| cls.addProcedure(factory); |
| Constructor constructor = new Constructor(new FunctionNode(null), |
| name: new Name('foo'), fileUri: uri); |
| cls.addConstructor(constructor); |
| Procedure redirectingFactory = new Procedure( |
| new Name('foo'), ProcedureKind.Factory, new FunctionNode(null), |
| fileUri: uri, isStatic: true) |
| ..isRedirectingFactory = true; |
| cls.addProcedure(redirectingFactory); |
| |
| TearOffConstant tearOffConstant1a = new StaticTearOffConstant(procedure1); |
| TearOffConstant tearOffConstant1b = new StaticTearOffConstant(procedure1); |
| TearOffConstant tearOffConstant2 = new StaticTearOffConstant(procedure2); |
| TearOffConstant tearOffConstant3 = new StaticTearOffConstant(procedure3); |
| TearOffConstant tearOffConstant4 = |
| new ConstructorTearOffConstant(constructor); |
| TearOffConstant tearOffConstant5 = new ConstructorTearOffConstant(factory); |
| TearOffConstant tearOffConstant6 = |
| new RedirectingFactoryTearOffConstant(redirectingFactory); |
| |
| // foo() {} |
| // const a = foo; |
| // const b = foo; |
| // a == b |
| testEquals(tearOffConstant1a, tearOffConstant1b); |
| |
| // foo() {} // from lib1; |
| // foo() {} // from lib2; |
| // lib1.foo != lib2.foo |
| testNotEquals(tearOffConstant1a, tearOffConstant2); |
| |
| // foo() {} |
| // typedef F = foo; |
| // typedef G = foo; |
| // F == G |
| testEquals(new TypedefTearOffConstant([], tearOffConstant1a, []), |
| new TypedefTearOffConstant([], tearOffConstant1b, [])); |
| |
| // foo() {} // from lib1; |
| // foo() {} // from lib2; |
| // typedef F = lib1.foo; |
| // typedef G = lib2.foo; |
| // F != G |
| testNotEquals(new TypedefTearOffConstant([], tearOffConstant1a, []), |
| new TypedefTearOffConstant([], tearOffConstant2, [])); |
| |
| // foo() {} |
| // typedef F<T> = foo; |
| // typedef G<S> = foo; |
| // F == G |
| testEquals( |
| new TypedefTearOffConstant( |
| [new TypeParameter('T', const DynamicType(), const DynamicType())], |
| tearOffConstant1a, |
| []), |
| new TypedefTearOffConstant( |
| [new TypeParameter('S', const DynamicType(), const DynamicType())], |
| tearOffConstant1b, |
| [])); |
| |
| // foo() {} |
| // typedef F<T1, T2> = foo; |
| // typedef G<S> = foo; |
| // F != G |
| testNotEquals( |
| new TypedefTearOffConstant( |
| [ |
| new TypeParameter('T1', const DynamicType(), const DynamicType()), |
| new TypeParameter('T2', const DynamicType(), const DynamicType()) |
| ], |
| tearOffConstant1a, |
| []), |
| new TypedefTearOffConstant( |
| [new TypeParameter('S', const DynamicType(), const DynamicType())], |
| tearOffConstant1b, |
| [])); |
| |
| // foo() {} |
| // typedef F<T extends void> = foo; |
| // typedef G<S> = foo; |
| // F != G |
| testNotEquals( |
| new TypedefTearOffConstant( |
| [new TypeParameter('T', const VoidType(), const DynamicType())], |
| tearOffConstant1a, |
| []), |
| new TypedefTearOffConstant( |
| [new TypeParameter('S', const DynamicType(), const DynamicType())], |
| tearOffConstant1b, |
| [])); |
| { |
| TypeParameter typeParameter1 = |
| new TypeParameter('T', const DynamicType(), const DynamicType()); |
| TypeParameter typeParameter2 = |
| new TypeParameter('S', const DynamicType(), const DynamicType()); |
| |
| // foo<X>() {} |
| // typedef F<T> = foo<T>; |
| // typedef G<S> = foo<S>; |
| // F == G |
| testEquals( |
| new TypedefTearOffConstant([typeParameter1], tearOffConstant3, |
| [new TypeParameterType(typeParameter1, Nullability.nullable)]), |
| new TypedefTearOffConstant([typeParameter2], tearOffConstant3, |
| [new TypeParameterType(typeParameter2, Nullability.nullable)])); |
| } |
| { |
| TypeParameter typeParameter1a = |
| new TypeParameter('T1', const DynamicType(), const DynamicType()); |
| TypeParameter typeParameter1b = |
| new TypeParameter('T2', const DynamicType(), const DynamicType()); |
| TypeParameter typeParameter2a = |
| new TypeParameter('S1', const DynamicType(), const DynamicType()); |
| TypeParameter typeParameter2b = |
| new TypeParameter('S2', const DynamicType(), const DynamicType()); |
| |
| // foo<X>() {} |
| // typedef F<T1, T2> = foo<T1>; |
| // typedef G<S1, S2> = foo<S1>; |
| // F == G |
| testEquals( |
| new TypedefTearOffConstant( |
| [typeParameter1a, typeParameter1b], |
| tearOffConstant3, |
| [new TypeParameterType(typeParameter1a, Nullability.nullable)]), |
| new TypedefTearOffConstant( |
| [typeParameter2a, typeParameter2b], |
| tearOffConstant3, |
| [new TypeParameterType(typeParameter2a, Nullability.nullable)])); |
| |
| // foo<X>() {} |
| // typedef F<T1, T2> = foo<T1>; |
| // typedef G<S1, S2> = foo<S2>; |
| // F != G |
| testNotEquals( |
| new TypedefTearOffConstant( |
| [typeParameter1a, typeParameter1b], |
| tearOffConstant3, |
| [new TypeParameterType(typeParameter1a, Nullability.nullable)]), |
| new TypedefTearOffConstant( |
| [typeParameter2a, typeParameter2b], |
| tearOffConstant3, |
| [new TypeParameterType(typeParameter2b, Nullability.nullable)])); |
| |
| testEquals(tearOffConstant4, tearOffConstant4); |
| testEquals(tearOffConstant5, tearOffConstant5); |
| testEquals(tearOffConstant6, tearOffConstant6); |
| |
| testNotEquals(tearOffConstant4, tearOffConstant5); |
| testNotEquals(tearOffConstant4, tearOffConstant6); |
| testNotEquals(tearOffConstant5, tearOffConstant6); |
| } |
| } |