| // 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'; |
| |
| void 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.'; |
| } |
| } |
| |
| void testNotEquals(Constant a, Constant b) { |
| if (a == b) { |
| throw 'Expected $a and $b to be not equal.'; |
| } |
| } |
| |
| void 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) |
| ..redirectingFactoryTarget = |
| new RedirectingFactoryTarget(constructor, []), |
| fileUri: uri, |
| isStatic: 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 StructuralParameter( |
| 'T', const DynamicType(), const DynamicType()) |
| ], |
| tearOffConstant1a, |
| []), |
| new TypedefTearOffConstant( |
| [ |
| new StructuralParameter( |
| 'S', const DynamicType(), const DynamicType()) |
| ], |
| tearOffConstant1b, |
| [])); |
| |
| // foo() {} |
| // typedef F<T1, T2> = foo; |
| // typedef G<S> = foo; |
| // F != G |
| testNotEquals( |
| new TypedefTearOffConstant( |
| [ |
| new StructuralParameter( |
| 'T1', const DynamicType(), const DynamicType()), |
| new StructuralParameter( |
| 'T2', const DynamicType(), const DynamicType()) |
| ], |
| tearOffConstant1a, |
| []), |
| new TypedefTearOffConstant( |
| [ |
| new StructuralParameter( |
| 'S', const DynamicType(), const DynamicType()) |
| ], |
| tearOffConstant1b, |
| [])); |
| |
| // foo() {} |
| // typedef F<T extends void> = foo; |
| // typedef G<S> = foo; |
| // F != G |
| testNotEquals( |
| new TypedefTearOffConstant( |
| [new StructuralParameter('T', const VoidType(), const DynamicType())], |
| tearOffConstant1a, |
| []), |
| new TypedefTearOffConstant( |
| [ |
| new StructuralParameter( |
| 'S', const DynamicType(), const DynamicType()) |
| ], |
| tearOffConstant1b, |
| [])); |
| { |
| StructuralParameter structuralParameter1 = |
| new StructuralParameter('T', const DynamicType(), const DynamicType()); |
| StructuralParameter structuralParameter2 = |
| new StructuralParameter('S', const DynamicType(), const DynamicType()); |
| |
| // foo<X>() {} |
| // typedef F<T> = foo<T>; |
| // typedef G<S> = foo<S>; |
| // F == G |
| testEquals( |
| new TypedefTearOffConstant( |
| [structuralParameter1], |
| tearOffConstant3, |
| [ |
| new StructuralParameterType( |
| structuralParameter1, Nullability.nullable) |
| ]), |
| new TypedefTearOffConstant( |
| [structuralParameter2], |
| tearOffConstant3, |
| [ |
| new StructuralParameterType( |
| structuralParameter2, Nullability.nullable) |
| ])); |
| } |
| { |
| StructuralParameter structuralParameter1a = |
| new StructuralParameter('T1', const DynamicType(), const DynamicType()); |
| StructuralParameter structuralParameter1b = |
| new StructuralParameter('T2', const DynamicType(), const DynamicType()); |
| StructuralParameter structuralParameter2a = |
| new StructuralParameter('S1', const DynamicType(), const DynamicType()); |
| StructuralParameter structuralParameter2b = |
| new StructuralParameter('S2', const DynamicType(), const DynamicType()); |
| |
| // foo<X>() {} |
| // typedef F<T1, T2> = foo<T1>; |
| // typedef G<S1, S2> = foo<S1>; |
| // F == G |
| testEquals( |
| new TypedefTearOffConstant( |
| [structuralParameter1a, structuralParameter1b], |
| tearOffConstant3, |
| [ |
| new StructuralParameterType( |
| structuralParameter1a, Nullability.nullable) |
| ]), |
| new TypedefTearOffConstant( |
| [structuralParameter2a, structuralParameter2b], |
| tearOffConstant3, |
| [ |
| new StructuralParameterType( |
| structuralParameter2a, Nullability.nullable) |
| ])); |
| |
| // foo<X>() {} |
| // typedef F<T1, T2> = foo<T1>; |
| // typedef G<S1, S2> = foo<S2>; |
| // F != G |
| testNotEquals( |
| new TypedefTearOffConstant( |
| [structuralParameter1a, structuralParameter1b], |
| tearOffConstant3, |
| [ |
| new StructuralParameterType( |
| structuralParameter1a, Nullability.nullable) |
| ]), |
| new TypedefTearOffConstant( |
| [structuralParameter2a, structuralParameter2b], |
| tearOffConstant3, |
| [ |
| new StructuralParameterType( |
| structuralParameter2b, Nullability.nullable) |
| ])); |
| |
| testEquals(tearOffConstant4, tearOffConstant4); |
| testEquals(tearOffConstant5, tearOffConstant5); |
| testEquals(tearOffConstant6, tearOffConstant6); |
| |
| testNotEquals(tearOffConstant4, tearOffConstant5); |
| testNotEquals(tearOffConstant4, tearOffConstant6); |
| testNotEquals(tearOffConstant5, tearOffConstant6); |
| } |
| } |