[cfe] Implement addHashCode to valueClass transformation

Change-Id: Ie566cee214b63f986e07c84e4ae28bfecc80e0a3
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/162186
Commit-Queue: Javier López-Contreras <jlcontreras@google.com>
Reviewed-by: Dmitry Stefantsov <dmitryas@google.com>
This commit is contained in:
jlcontreras 2020-09-11 16:05:52 +00:00 committed by commit-bot@chromium.org
parent af110a7aa4
commit da6cdc55b4
42 changed files with 448 additions and 126 deletions

View file

@ -1,6 +1,7 @@
library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
import "value_class_support_lib.dart" as val;
import "org-dartlang-testcase:///value_class_support_lib.dart";
@ -10,15 +11,17 @@ class EmptyClass extends core::Object {
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::EmptyClass;
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish("org-dartlang-testcase:///empty.dartEmptyClass".{core::String::hashCode});
}
static method main() → dynamic {}
library /*isNonNullableByDefault*/;
import self as self2;
import self as val;
import "dart:core" as core;
class JenkinsSmiHash extends core::Object {
synthetic constructor •() → self2::JenkinsSmiHash
synthetic constructor •() → val::JenkinsSmiHash
: super core::Object::•()
;
static method combine(core::int hash, core::int value) → core::int {

View file

@ -1,6 +1,7 @@
library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
import "value_class_support_lib.dart" as val;
import "org-dartlang-testcase:///value_class_support_lib.dart";
@ -10,15 +11,17 @@ class EmptyClass extends core::Object {
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::EmptyClass;
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish("org-dartlang-testcase:///empty.dartEmptyClass".{core::String::hashCode});
}
static method main() → dynamic {}
library /*isNonNullableByDefault*/;
import self as self2;
import self as val;
import "dart:core" as core;
class JenkinsSmiHash extends core::Object {
synthetic constructor •() → self2::JenkinsSmiHash
synthetic constructor •() → val::JenkinsSmiHash
: super core::Object::•()
;
static method combine(core::int hash, core::int value) → core::int {

View file

@ -1,6 +1,7 @@
library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
import "value_class_support_lib.dart" as val;
import "org-dartlang-testcase:///value_class_support_lib.dart";
@ -10,15 +11,17 @@ class EmptyClass extends core::Object {
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::EmptyClass;
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish("org-dartlang-testcase:///empty.dartEmptyClass".{core::String::hashCode});
}
static method main() → dynamic {}
library /*isNonNullableByDefault*/;
import self as self2;
import self as val;
import "dart:core" as core;
class JenkinsSmiHash extends core::Object {
synthetic constructor •() → self2::JenkinsSmiHash
synthetic constructor •() → val::JenkinsSmiHash
: super core::Object::•()
;
static method combine(core::int hash, core::int value) → core::int {

View file

@ -1,6 +1,7 @@
library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
import "value_class_support_lib.dart" as val;
import "org-dartlang-testcase:///value_class_support_lib.dart";
@ -10,15 +11,17 @@ class EmptyClass extends core::Object {
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::EmptyClass;
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish("org-dartlang-testcase:///empty.dartEmptyClass".{core::String::hashCode});
}
static method main() → dynamic {}
library /*isNonNullableByDefault*/;
import self as self2;
import self as val;
import "dart:core" as core;
class JenkinsSmiHash extends core::Object {
synthetic constructor •() → self2::JenkinsSmiHash
synthetic constructor •() → val::JenkinsSmiHash
: super core::Object::•()
;
static method combine(core::int hash, core::int value) → core::int {

View file

@ -1,6 +1,7 @@
library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
import "value_class_support_lib.dart" as val;
import "org-dartlang-testcase:///value_class_support_lib.dart";
@ -10,6 +11,8 @@ class A extends core::Object {
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::A;
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish("org-dartlang-testcase:///explicit_mixin.dartA".{core::String::hashCode});
}
class B extends core::Object {
synthetic constructor •() → self::B
@ -37,15 +40,17 @@ class F = self::B with self::C {
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::F;
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish("org-dartlang-testcase:///explicit_mixin.dartF".{core::String::hashCode});
}
static method main() → dynamic {}
library /*isNonNullableByDefault*/;
import self as self2;
import self as val;
import "dart:core" as core;
class JenkinsSmiHash extends core::Object {
synthetic constructor •() → self2::JenkinsSmiHash
synthetic constructor •() → val::JenkinsSmiHash
: super core::Object::•()
;
static method combine(core::int hash, core::int value) → core::int {

View file

@ -1,6 +1,7 @@
library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
import "value_class_support_lib.dart" as val;
import "org-dartlang-testcase:///value_class_support_lib.dart";
@ -10,6 +11,8 @@ class A extends core::Object {
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::A;
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish("org-dartlang-testcase:///explicit_mixin.dartA".{core::String::hashCode});
}
class B extends core::Object {
synthetic constructor •() → self::B
@ -32,6 +35,8 @@ class E extends self::B implements self::A /*isEliminatedMixin*/ {
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::A;
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish("org-dartlang-testcase:///explicit_mixin.dartA".{core::String::hashCode});
}
class F extends self::B implements self::C /*isEliminatedMixin*/ {
synthetic constructor •() → self::F
@ -39,15 +44,17 @@ class F extends self::B implements self::C /*isEliminatedMixin*/ {
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::F;
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish("org-dartlang-testcase:///explicit_mixin.dartF".{core::String::hashCode});
}
static method main() → dynamic {}
library /*isNonNullableByDefault*/;
import self as self2;
import self as val;
import "dart:core" as core;
class JenkinsSmiHash extends core::Object {
synthetic constructor •() → self2::JenkinsSmiHash
synthetic constructor •() → val::JenkinsSmiHash
: super core::Object::•()
;
static method combine(core::int hash, core::int value) → core::int {

View file

@ -1,6 +1,7 @@
library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
import "value_class_support_lib.dart" as val;
import "org-dartlang-testcase:///value_class_support_lib.dart";
@ -10,6 +11,8 @@ class A extends core::Object {
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::A;
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish("org-dartlang-testcase:///explicit_mixin.dartA".{core::String::hashCode});
}
class B extends core::Object {
synthetic constructor •() → self::B
@ -37,15 +40,17 @@ class F = self::B with self::C {
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::F;
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish("org-dartlang-testcase:///explicit_mixin.dartF".{core::String::hashCode});
}
static method main() → dynamic {}
library /*isNonNullableByDefault*/;
import self as self2;
import self as val;
import "dart:core" as core;
class JenkinsSmiHash extends core::Object {
synthetic constructor •() → self2::JenkinsSmiHash
synthetic constructor •() → val::JenkinsSmiHash
: super core::Object::•()
;
static method combine(core::int hash, core::int value) → core::int {

View file

@ -1,6 +1,7 @@
library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
import "value_class_support_lib.dart" as val;
import "org-dartlang-testcase:///value_class_support_lib.dart";
@ -10,6 +11,8 @@ class A extends core::Object {
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::A;
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish("org-dartlang-testcase:///explicit_mixin.dartA".{core::String::hashCode});
}
class B extends core::Object {
synthetic constructor •() → self::B
@ -32,6 +35,8 @@ class E extends self::B implements self::A /*isEliminatedMixin*/ {
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::A;
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish("org-dartlang-testcase:///explicit_mixin.dartA".{core::String::hashCode});
}
class F extends self::B implements self::C /*isEliminatedMixin*/ {
synthetic constructor •() → self::F
@ -39,15 +44,17 @@ class F extends self::B implements self::C /*isEliminatedMixin*/ {
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::F;
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish("org-dartlang-testcase:///explicit_mixin.dartF".{core::String::hashCode});
}
static method main() → dynamic {}
library /*isNonNullableByDefault*/;
import self as self2;
import self as val;
import "dart:core" as core;
class JenkinsSmiHash extends core::Object {
synthetic constructor •() → self2::JenkinsSmiHash
synthetic constructor •() → val::JenkinsSmiHash
: super core::Object::•()
;
static method combine(core::int hash, core::int value) → core::int {

View file

@ -8,6 +8,7 @@ library /*isNonNullableByDefault*/;
//
import self as self;
import "dart:core" as core;
import "value_class_support_lib.dart" as val;
import "org-dartlang-testcase:///value_class_support_lib.dart";
@ -18,15 +19,17 @@ class Animal extends core::Object {
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_final_field_error.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
}
static method main() → dynamic {}
library /*isNonNullableByDefault*/;
import self as self2;
import self as val;
import "dart:core" as core;
class JenkinsSmiHash extends core::Object {
synthetic constructor •() → self2::JenkinsSmiHash
synthetic constructor •() → val::JenkinsSmiHash
: super core::Object::•()
;
static method combine(core::int hash, core::int value) → core::int {

View file

@ -8,6 +8,7 @@ library /*isNonNullableByDefault*/;
//
import self as self;
import "dart:core" as core;
import "value_class_support_lib.dart" as val;
import "org-dartlang-testcase:///value_class_support_lib.dart";
@ -18,15 +19,17 @@ class Animal extends core::Object {
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_final_field_error.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
}
static method main() → dynamic {}
library /*isNonNullableByDefault*/;
import self as self2;
import self as val;
import "dart:core" as core;
class JenkinsSmiHash extends core::Object {
synthetic constructor •() → self2::JenkinsSmiHash
synthetic constructor •() → val::JenkinsSmiHash
: super core::Object::•()
;
static method combine(core::int hash, core::int value) → core::int {

View file

@ -8,6 +8,7 @@ library /*isNonNullableByDefault*/;
//
import self as self;
import "dart:core" as core;
import "value_class_support_lib.dart" as val;
import "org-dartlang-testcase:///value_class_support_lib.dart";
@ -18,15 +19,17 @@ class Animal extends core::Object {
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_final_field_error.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
}
static method main() → dynamic {}
library /*isNonNullableByDefault*/;
import self as self2;
import self as val;
import "dart:core" as core;
class JenkinsSmiHash extends core::Object {
synthetic constructor •() → self2::JenkinsSmiHash
synthetic constructor •() → val::JenkinsSmiHash
: super core::Object::•()
;
static method combine(core::int hash, core::int value) → core::int {

View file

@ -8,6 +8,7 @@ library /*isNonNullableByDefault*/;
//
import self as self;
import "dart:core" as core;
import "value_class_support_lib.dart" as val;
import "org-dartlang-testcase:///value_class_support_lib.dart";
@ -18,15 +19,17 @@ class Animal extends core::Object {
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_final_field_error.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
}
static method main() → dynamic {}
library /*isNonNullableByDefault*/;
import self as self2;
import self as val;
import "dart:core" as core;
class JenkinsSmiHash extends core::Object {
synthetic constructor •() → self2::JenkinsSmiHash
synthetic constructor •() → val::JenkinsSmiHash
: super core::Object::•()
;
static method combine(core::int hash, core::int value) → core::int {

View file

@ -9,6 +9,7 @@ library /*isNonNullableByDefault*/;
//
import self as self;
import "dart:core" as core;
import "value_class_support_lib.dart" as val;
import "org-dartlang-testcase:///value_class_support_lib.dart";
@ -19,6 +20,8 @@ class Animal extends core::Object {
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_value_extends_value_error.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
}
class Cat extends self::Animal {
synthetic constructor •() → self::Cat
@ -28,11 +31,11 @@ class Cat extends self::Animal {
static method main() → dynamic {}
library /*isNonNullableByDefault*/;
import self as self2;
import self as val;
import "dart:core" as core;
class JenkinsSmiHash extends core::Object {
synthetic constructor •() → self2::JenkinsSmiHash
synthetic constructor •() → val::JenkinsSmiHash
: super core::Object::•()
;
static method combine(core::int hash, core::int value) → core::int {

View file

@ -9,6 +9,7 @@ library /*isNonNullableByDefault*/;
//
import self as self;
import "dart:core" as core;
import "value_class_support_lib.dart" as val;
import "org-dartlang-testcase:///value_class_support_lib.dart";
@ -19,6 +20,8 @@ class Animal extends core::Object {
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_value_extends_value_error.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
}
class Cat extends self::Animal {
synthetic constructor •() → self::Cat
@ -28,11 +31,11 @@ class Cat extends self::Animal {
static method main() → dynamic {}
library /*isNonNullableByDefault*/;
import self as self2;
import self as val;
import "dart:core" as core;
class JenkinsSmiHash extends core::Object {
synthetic constructor •() → self2::JenkinsSmiHash
synthetic constructor •() → val::JenkinsSmiHash
: super core::Object::•()
;
static method combine(core::int hash, core::int value) → core::int {

View file

@ -9,6 +9,7 @@ library /*isNonNullableByDefault*/;
//
import self as self;
import "dart:core" as core;
import "value_class_support_lib.dart" as val;
import "org-dartlang-testcase:///value_class_support_lib.dart";
@ -19,6 +20,8 @@ class Animal extends core::Object {
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_value_extends_value_error.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
}
class Cat extends self::Animal {
synthetic constructor •() → self::Cat
@ -28,11 +31,11 @@ class Cat extends self::Animal {
static method main() → dynamic {}
library /*isNonNullableByDefault*/;
import self as self2;
import self as val;
import "dart:core" as core;
class JenkinsSmiHash extends core::Object {
synthetic constructor •() → self2::JenkinsSmiHash
synthetic constructor •() → val::JenkinsSmiHash
: super core::Object::•()
;
static method combine(core::int hash, core::int value) → core::int {

View file

@ -9,6 +9,7 @@ library /*isNonNullableByDefault*/;
//
import self as self;
import "dart:core" as core;
import "value_class_support_lib.dart" as val;
import "org-dartlang-testcase:///value_class_support_lib.dart";
@ -19,6 +20,8 @@ class Animal extends core::Object {
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_value_extends_value_error.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
}
class Cat extends self::Animal {
synthetic constructor •() → self::Cat
@ -28,11 +31,11 @@ class Cat extends self::Animal {
static method main() → dynamic {}
library /*isNonNullableByDefault*/;
import self as self2;
import self as val;
import "dart:core" as core;
class JenkinsSmiHash extends core::Object {
synthetic constructor •() → self2::JenkinsSmiHash
synthetic constructor •() → val::JenkinsSmiHash
: super core::Object::•()
;
static method combine(core::int hash, core::int value) → core::int {

View file

@ -14,6 +14,7 @@ library /*isNonNullableByDefault*/;
//
import self as self;
import "dart:core" as core;
import "value_class_support_lib.dart" as val;
import "org-dartlang-testcase:///value_class_support_lib.dart";
@ -24,6 +25,8 @@ class Animal extends core::Object {
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_value_implements_value_error.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
}
class Cat extends core::Object implements self::Animal {
final field core::int numberOfLegs = null;
@ -34,11 +37,11 @@ class Cat extends core::Object implements self::Animal {
static method main() → dynamic {}
library /*isNonNullableByDefault*/;
import self as self2;
import self as val;
import "dart:core" as core;
class JenkinsSmiHash extends core::Object {
synthetic constructor •() → self2::JenkinsSmiHash
synthetic constructor •() → val::JenkinsSmiHash
: super core::Object::•()
;
static method combine(core::int hash, core::int value) → core::int {

View file

@ -14,6 +14,7 @@ library /*isNonNullableByDefault*/;
//
import self as self;
import "dart:core" as core;
import "value_class_support_lib.dart" as val;
import "org-dartlang-testcase:///value_class_support_lib.dart";
@ -24,6 +25,8 @@ class Animal extends core::Object {
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_value_implements_value_error.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
}
class Cat extends core::Object implements self::Animal {
final field core::int numberOfLegs = null;
@ -34,11 +37,11 @@ class Cat extends core::Object implements self::Animal {
static method main() → dynamic {}
library /*isNonNullableByDefault*/;
import self as self2;
import self as val;
import "dart:core" as core;
class JenkinsSmiHash extends core::Object {
synthetic constructor •() → self2::JenkinsSmiHash
synthetic constructor •() → val::JenkinsSmiHash
: super core::Object::•()
;
static method combine(core::int hash, core::int value) → core::int {

View file

@ -14,6 +14,7 @@ library /*isNonNullableByDefault*/;
//
import self as self;
import "dart:core" as core;
import "value_class_support_lib.dart" as val;
import "org-dartlang-testcase:///value_class_support_lib.dart";
@ -24,6 +25,8 @@ class Animal extends core::Object {
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_value_implements_value_error.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
}
class Cat extends core::Object implements self::Animal {
final field core::int numberOfLegs = null;
@ -34,11 +37,11 @@ class Cat extends core::Object implements self::Animal {
static method main() → dynamic {}
library /*isNonNullableByDefault*/;
import self as self2;
import self as val;
import "dart:core" as core;
class JenkinsSmiHash extends core::Object {
synthetic constructor •() → self2::JenkinsSmiHash
synthetic constructor •() → val::JenkinsSmiHash
: super core::Object::•()
;
static method combine(core::int hash, core::int value) → core::int {

View file

@ -14,6 +14,7 @@ library /*isNonNullableByDefault*/;
//
import self as self;
import "dart:core" as core;
import "value_class_support_lib.dart" as val;
import "org-dartlang-testcase:///value_class_support_lib.dart";
@ -24,6 +25,8 @@ class Animal extends core::Object {
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_value_implements_value_error.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
}
class Cat extends core::Object implements self::Animal {
final field core::int numberOfLegs = null;
@ -34,11 +37,11 @@ class Cat extends core::Object implements self::Animal {
static method main() → dynamic {}
library /*isNonNullableByDefault*/;
import self as self2;
import self as val;
import "dart:core" as core;
class JenkinsSmiHash extends core::Object {
synthetic constructor •() → self2::JenkinsSmiHash
synthetic constructor •() → val::JenkinsSmiHash
: super core::Object::•()
;
static method combine(core::int hash, core::int value) → core::int {

View file

@ -30,6 +30,7 @@ library /*isNonNullableByDefault*/;
//
import self as self;
import "dart:core" as core;
import "value_class_support_lib.dart" as val;
import "org-dartlang-testcase:///value_class_support_lib.dart";
@ -40,6 +41,8 @@ class Animal extends core::Object {
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///simple.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
}
static method main() → dynamic {
self::Animal firstAnimal = invalid-expression "pkg/front_end/testcases/value_class/simple.dart:13:31: Error: No named parameter with the name 'numberOfLegs'.
@ -62,11 +65,11 @@ static method expect(core::Object? expected, core::Object? actual) → dynamic {
}
library /*isNonNullableByDefault*/;
import self as self2;
import self as val;
import "dart:core" as core;
class JenkinsSmiHash extends core::Object {
synthetic constructor •() → self2::JenkinsSmiHash
synthetic constructor •() → val::JenkinsSmiHash
: super core::Object::•()
;
static method combine(core::int hash, core::int value) → core::int {

View file

@ -30,6 +30,7 @@ library /*isNonNullableByDefault*/;
//
import self as self;
import "dart:core" as core;
import "value_class_support_lib.dart" as val;
import "org-dartlang-testcase:///value_class_support_lib.dart";
@ -40,6 +41,8 @@ class Animal extends core::Object {
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///simple.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
}
static method main() → dynamic {
self::Animal firstAnimal = invalid-expression "pkg/front_end/testcases/value_class/simple.dart:13:31: Error: No named parameter with the name 'numberOfLegs'.
@ -62,11 +65,11 @@ static method expect(core::Object? expected, core::Object? actual) → dynamic {
}
library /*isNonNullableByDefault*/;
import self as self2;
import self as val;
import "dart:core" as core;
class JenkinsSmiHash extends core::Object {
synthetic constructor •() → self2::JenkinsSmiHash
synthetic constructor •() → val::JenkinsSmiHash
: super core::Object::•()
;
static method combine(core::int hash, core::int value) → core::int {

View file

@ -30,6 +30,7 @@ library /*isNonNullableByDefault*/;
//
import self as self;
import "dart:core" as core;
import "value_class_support_lib.dart" as val;
import "org-dartlang-testcase:///value_class_support_lib.dart";
@ -40,6 +41,8 @@ class Animal extends core::Object {
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///simple.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
}
static method main() → dynamic {
self::Animal firstAnimal = invalid-expression "pkg/front_end/testcases/value_class/simple.dart:13:31: Error: No named parameter with the name 'numberOfLegs'.
@ -62,11 +65,11 @@ static method expect(core::Object? expected, core::Object? actual) → dynamic {
}
library /*isNonNullableByDefault*/;
import self as self2;
import self as val;
import "dart:core" as core;
class JenkinsSmiHash extends core::Object {
synthetic constructor •() → self2::JenkinsSmiHash
synthetic constructor •() → val::JenkinsSmiHash
: super core::Object::•()
;
static method combine(core::int hash, core::int value) → core::int {

View file

@ -30,6 +30,7 @@ library /*isNonNullableByDefault*/;
//
import self as self;
import "dart:core" as core;
import "value_class_support_lib.dart" as val;
import "org-dartlang-testcase:///value_class_support_lib.dart";
@ -40,6 +41,8 @@ class Animal extends core::Object {
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///simple.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
}
static method main() → dynamic {
self::Animal firstAnimal = invalid-expression "pkg/front_end/testcases/value_class/simple.dart:13:31: Error: No named parameter with the name 'numberOfLegs'.
@ -62,11 +65,11 @@ static method expect(core::Object? expected, core::Object? actual) → dynamic {
}
library /*isNonNullableByDefault*/;
import self as self2;
import self as val;
import "dart:core" as core;
class JenkinsSmiHash extends core::Object {
synthetic constructor •() → self2::JenkinsSmiHash
synthetic constructor •() → val::JenkinsSmiHash
: super core::Object::•()
;
static method combine(core::int hash, core::int value) → core::int {

View file

@ -30,6 +30,7 @@ library /*isNonNullableByDefault*/;
//
import self as self;
import "dart:core" as core;
import "value_class_support_lib.dart" as val;
import "org-dartlang-testcase:///value_class_support_lib.dart";
@ -46,6 +47,8 @@ class Cat extends self::Animal {
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::Cat && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Cat}.{self::Animal::numberOfLegs}) && this.{self::Cat::numberOfWhiskers}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfWhiskers});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_extends_non_value.dartCat".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}), this.{self::Cat::numberOfWhiskers}.{core::num::hashCode}));
}
static method main() → dynamic {
self::Cat firstCat = invalid-expression "pkg/front_end/testcases/value_class/value_extends_non_value.dart:18:22: Error: No named parameter with the name 'numberOfLegs'.
@ -68,11 +71,11 @@ static method expect(core::Object? expected, core::Object? actual) → dynamic {
}
library /*isNonNullableByDefault*/;
import self as self2;
import self as val;
import "dart:core" as core;
class JenkinsSmiHash extends core::Object {
synthetic constructor •() → self2::JenkinsSmiHash
synthetic constructor •() → val::JenkinsSmiHash
: super core::Object::•()
;
static method combine(core::int hash, core::int value) → core::int {

View file

@ -30,6 +30,7 @@ library /*isNonNullableByDefault*/;
//
import self as self;
import "dart:core" as core;
import "value_class_support_lib.dart" as val;
import "org-dartlang-testcase:///value_class_support_lib.dart";
@ -46,6 +47,8 @@ class Cat extends self::Animal {
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::Cat && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Cat}.{self::Animal::numberOfLegs}) && this.{self::Cat::numberOfWhiskers}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfWhiskers});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_extends_non_value.dartCat".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}), this.{self::Cat::numberOfWhiskers}.{core::num::hashCode}));
}
static method main() → dynamic {
self::Cat firstCat = invalid-expression "pkg/front_end/testcases/value_class/value_extends_non_value.dart:18:22: Error: No named parameter with the name 'numberOfLegs'.
@ -68,11 +71,11 @@ static method expect(core::Object? expected, core::Object? actual) → dynamic {
}
library /*isNonNullableByDefault*/;
import self as self2;
import self as val;
import "dart:core" as core;
class JenkinsSmiHash extends core::Object {
synthetic constructor •() → self2::JenkinsSmiHash
synthetic constructor •() → val::JenkinsSmiHash
: super core::Object::•()
;
static method combine(core::int hash, core::int value) → core::int {

View file

@ -30,6 +30,7 @@ library /*isNonNullableByDefault*/;
//
import self as self;
import "dart:core" as core;
import "value_class_support_lib.dart" as val;
import "org-dartlang-testcase:///value_class_support_lib.dart";
@ -46,6 +47,8 @@ class Cat extends self::Animal {
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::Cat && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Cat}.{self::Animal::numberOfLegs}) && this.{self::Cat::numberOfWhiskers}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfWhiskers});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_extends_non_value.dartCat".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}), this.{self::Cat::numberOfWhiskers}.{core::num::hashCode}));
}
static method main() → dynamic {
self::Cat firstCat = invalid-expression "pkg/front_end/testcases/value_class/value_extends_non_value.dart:18:22: Error: No named parameter with the name 'numberOfLegs'.
@ -68,11 +71,11 @@ static method expect(core::Object? expected, core::Object? actual) → dynamic {
}
library /*isNonNullableByDefault*/;
import self as self2;
import self as val;
import "dart:core" as core;
class JenkinsSmiHash extends core::Object {
synthetic constructor •() → self2::JenkinsSmiHash
synthetic constructor •() → val::JenkinsSmiHash
: super core::Object::•()
;
static method combine(core::int hash, core::int value) → core::int {

View file

@ -30,6 +30,7 @@ library /*isNonNullableByDefault*/;
//
import self as self;
import "dart:core" as core;
import "value_class_support_lib.dart" as val;
import "org-dartlang-testcase:///value_class_support_lib.dart";
@ -46,6 +47,8 @@ class Cat extends self::Animal {
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::Cat && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Cat}.{self::Animal::numberOfLegs}) && this.{self::Cat::numberOfWhiskers}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfWhiskers});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_extends_non_value.dartCat".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}), this.{self::Cat::numberOfWhiskers}.{core::num::hashCode}));
}
static method main() → dynamic {
self::Cat firstCat = invalid-expression "pkg/front_end/testcases/value_class/value_extends_non_value.dart:18:22: Error: No named parameter with the name 'numberOfLegs'.
@ -68,11 +71,11 @@ static method expect(core::Object? expected, core::Object? actual) → dynamic {
}
library /*isNonNullableByDefault*/;
import self as self2;
import self as val;
import "dart:core" as core;
class JenkinsSmiHash extends core::Object {
synthetic constructor •() → self2::JenkinsSmiHash
synthetic constructor •() → val::JenkinsSmiHash
: super core::Object::•()
;
static method combine(core::int hash, core::int value) → core::int {

View file

@ -13,6 +13,7 @@ library /*isNonNullableByDefault*/;
//
import self as self;
import "dart:core" as core;
import "value_class_support_lib.dart" as val;
import "org-dartlang-testcase:///value_class_support_lib.dart";
@ -28,6 +29,8 @@ class Cat extends self::Animal {
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::Cat;
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_extends_non_value_error.dartCat".{core::String::hashCode});
}
class Animal2 extends core::Object {
final field core::int numberOfLegs = null;
@ -41,15 +44,17 @@ class Cat2 extends self::Animal2 {
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::Cat2;
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_extends_non_value_error.dartCat2".{core::String::hashCode});
}
static method main() → dynamic {}
library /*isNonNullableByDefault*/;
import self as self2;
import self as val;
import "dart:core" as core;
class JenkinsSmiHash extends core::Object {
synthetic constructor •() → self2::JenkinsSmiHash
synthetic constructor •() → val::JenkinsSmiHash
: super core::Object::•()
;
static method combine(core::int hash, core::int value) → core::int {

View file

@ -13,6 +13,7 @@ library /*isNonNullableByDefault*/;
//
import self as self;
import "dart:core" as core;
import "value_class_support_lib.dart" as val;
import "org-dartlang-testcase:///value_class_support_lib.dart";
@ -28,6 +29,8 @@ class Cat extends self::Animal {
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::Cat;
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_extends_non_value_error.dartCat".{core::String::hashCode});
}
class Animal2 extends core::Object {
final field core::int numberOfLegs = null;
@ -41,15 +44,17 @@ class Cat2 extends self::Animal2 {
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::Cat2;
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_extends_non_value_error.dartCat2".{core::String::hashCode});
}
static method main() → dynamic {}
library /*isNonNullableByDefault*/;
import self as self2;
import self as val;
import "dart:core" as core;
class JenkinsSmiHash extends core::Object {
synthetic constructor •() → self2::JenkinsSmiHash
synthetic constructor •() → val::JenkinsSmiHash
: super core::Object::•()
;
static method combine(core::int hash, core::int value) → core::int {

View file

@ -13,6 +13,7 @@ library /*isNonNullableByDefault*/;
//
import self as self;
import "dart:core" as core;
import "value_class_support_lib.dart" as val;
import "org-dartlang-testcase:///value_class_support_lib.dart";
@ -28,6 +29,8 @@ class Cat extends self::Animal {
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::Cat;
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_extends_non_value_error.dartCat".{core::String::hashCode});
}
class Animal2 extends core::Object {
final field core::int numberOfLegs = null;
@ -41,15 +44,17 @@ class Cat2 extends self::Animal2 {
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::Cat2;
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_extends_non_value_error.dartCat2".{core::String::hashCode});
}
static method main() → dynamic {}
library /*isNonNullableByDefault*/;
import self as self2;
import self as val;
import "dart:core" as core;
class JenkinsSmiHash extends core::Object {
synthetic constructor •() → self2::JenkinsSmiHash
synthetic constructor •() → val::JenkinsSmiHash
: super core::Object::•()
;
static method combine(core::int hash, core::int value) → core::int {

View file

@ -13,6 +13,7 @@ library /*isNonNullableByDefault*/;
//
import self as self;
import "dart:core" as core;
import "value_class_support_lib.dart" as val;
import "org-dartlang-testcase:///value_class_support_lib.dart";
@ -28,6 +29,8 @@ class Cat extends self::Animal {
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::Cat;
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_extends_non_value_error.dartCat".{core::String::hashCode});
}
class Animal2 extends core::Object {
final field core::int numberOfLegs = null;
@ -41,15 +44,17 @@ class Cat2 extends self::Animal2 {
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::Cat2;
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_extends_non_value_error.dartCat2".{core::String::hashCode});
}
static method main() → dynamic {}
library /*isNonNullableByDefault*/;
import self as self2;
import self as val;
import "dart:core" as core;
class JenkinsSmiHash extends core::Object {
synthetic constructor •() → self2::JenkinsSmiHash
synthetic constructor •() → val::JenkinsSmiHash
: super core::Object::•()
;
static method combine(core::int hash, core::int value) → core::int {

View file

@ -71,6 +71,7 @@ library /*isNonNullableByDefault*/;
//
import self as self;
import "dart:core" as core;
import "value_class_support_lib.dart" as val;
import "org-dartlang-testcase-sdk:///pkg/front_end/testcases/nnbd_mixed/nnbd_opt_out_language_version.dart";
import "org-dartlang-testcase:///value_class_support_lib.dart";
@ -89,6 +90,8 @@ class Cat extends core::Object implements self::Animal {
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::Cat && this.{self::Cat::numberOfLegs}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfLegs}) && this.{self::Cat::numberOfWhiskers}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfWhiskers});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_implements_non_value.dartCat".{core::String::hashCode}, this.{self::Cat::numberOfLegs}.{core::num::hashCode}), this.{self::Cat::numberOfWhiskers}.{core::num::hashCode}));
}
abstract class Animal2 extends core::Object {
synthetic constructor •() → self::Animal2
@ -104,6 +107,8 @@ class Cat2 extends core::Object implements self::Animal2 {
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::Cat2 && this.{self::Cat2::numberOfLegs}.{core::num::==}(other{self::Cat2}.{self::Cat2::numberOfLegs}) && this.{self::Cat2::numberOfWhiskers}.{core::num::==}(other{self::Cat2}.{self::Cat2::numberOfWhiskers});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_implements_non_value.dartCat2".{core::String::hashCode}, this.{self::Cat2::numberOfLegs}.{core::num::hashCode}), this.{self::Cat2::numberOfWhiskers}.{core::num::hashCode}));
}
static method main() → dynamic {
self::Cat firstCat = invalid-expression "pkg/front_end/testcases/value_class/value_implements_non_value.dart:30:22: Error: No named parameter with the name 'numberOfLegs'.
@ -201,11 +206,11 @@ static method main() → dynamic {
}
library /*isNonNullableByDefault*/;
import self as self3;
import self as val;
import "dart:core" as core;
class JenkinsSmiHash extends core::Object {
synthetic constructor •() → self3::JenkinsSmiHash
synthetic constructor •() → val::JenkinsSmiHash
: super core::Object::•()
;
static method combine(core::int hash, core::int value) → core::int {

View file

@ -71,6 +71,7 @@ library /*isNonNullableByDefault*/;
//
import self as self;
import "dart:core" as core;
import "value_class_support_lib.dart" as val;
import "org-dartlang-testcase-sdk:///pkg/front_end/testcases/nnbd_mixed/nnbd_opt_out_language_version.dart";
import "org-dartlang-testcase:///value_class_support_lib.dart";
@ -89,6 +90,8 @@ class Cat extends core::Object implements self::Animal {
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::Cat && this.{self::Cat::numberOfLegs}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfLegs}) && this.{self::Cat::numberOfWhiskers}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfWhiskers});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_implements_non_value.dartCat".{core::String::hashCode}, this.{self::Cat::numberOfLegs}.{core::num::hashCode}), this.{self::Cat::numberOfWhiskers}.{core::num::hashCode}));
}
abstract class Animal2 extends core::Object {
synthetic constructor •() → self::Animal2
@ -104,6 +107,8 @@ class Cat2 extends core::Object implements self::Animal2 {
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::Cat2 && this.{self::Cat2::numberOfLegs}.{core::num::==}(other{self::Cat2}.{self::Cat2::numberOfLegs}) && this.{self::Cat2::numberOfWhiskers}.{core::num::==}(other{self::Cat2}.{self::Cat2::numberOfWhiskers});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_implements_non_value.dartCat2".{core::String::hashCode}, this.{self::Cat2::numberOfLegs}.{core::num::hashCode}), this.{self::Cat2::numberOfWhiskers}.{core::num::hashCode}));
}
static method main() → dynamic {
self::Cat firstCat = invalid-expression "pkg/front_end/testcases/value_class/value_implements_non_value.dart:30:22: Error: No named parameter with the name 'numberOfLegs'.
@ -201,11 +206,11 @@ static method main() → dynamic {
}
library /*isNonNullableByDefault*/;
import self as self3;
import self as val;
import "dart:core" as core;
class JenkinsSmiHash extends core::Object {
synthetic constructor •() → self3::JenkinsSmiHash
synthetic constructor •() → val::JenkinsSmiHash
: super core::Object::•()
;
static method combine(core::int hash, core::int value) → core::int {

View file

@ -71,6 +71,7 @@ library /*isNonNullableByDefault*/;
//
import self as self;
import "dart:core" as core;
import "value_class_support_lib.dart" as val;
import "org-dartlang-testcase-sdk:///pkg/front_end/testcases/nnbd_mixed/nnbd_opt_out_language_version.dart";
import "org-dartlang-testcase:///value_class_support_lib.dart";
@ -89,6 +90,8 @@ class Cat extends core::Object implements self::Animal {
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::Cat && this.{self::Cat::numberOfLegs}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfLegs}) && this.{self::Cat::numberOfWhiskers}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfWhiskers});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_implements_non_value.dartCat".{core::String::hashCode}, this.{self::Cat::numberOfLegs}.{core::num::hashCode}), this.{self::Cat::numberOfWhiskers}.{core::num::hashCode}));
}
abstract class Animal2 extends core::Object {
synthetic constructor •() → self::Animal2
@ -104,6 +107,8 @@ class Cat2 extends core::Object implements self::Animal2 {
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::Cat2 && this.{self::Cat2::numberOfLegs}.{core::num::==}(other{self::Cat2}.{self::Cat2::numberOfLegs}) && this.{self::Cat2::numberOfWhiskers}.{core::num::==}(other{self::Cat2}.{self::Cat2::numberOfWhiskers});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_implements_non_value.dartCat2".{core::String::hashCode}, this.{self::Cat2::numberOfLegs}.{core::num::hashCode}), this.{self::Cat2::numberOfWhiskers}.{core::num::hashCode}));
}
static method main() → dynamic {
self::Cat firstCat = invalid-expression "pkg/front_end/testcases/value_class/value_implements_non_value.dart:30:22: Error: No named parameter with the name 'numberOfLegs'.
@ -201,11 +206,11 @@ static method main() → dynamic {
}
library /*isNonNullableByDefault*/;
import self as self3;
import self as val;
import "dart:core" as core;
class JenkinsSmiHash extends core::Object {
synthetic constructor •() → self3::JenkinsSmiHash
synthetic constructor •() → val::JenkinsSmiHash
: super core::Object::•()
;
static method combine(core::int hash, core::int value) → core::int {

View file

@ -71,6 +71,7 @@ library /*isNonNullableByDefault*/;
//
import self as self;
import "dart:core" as core;
import "value_class_support_lib.dart" as val;
import "org-dartlang-testcase-sdk:///pkg/front_end/testcases/nnbd_mixed/nnbd_opt_out_language_version.dart";
import "org-dartlang-testcase:///value_class_support_lib.dart";
@ -89,6 +90,8 @@ class Cat extends core::Object implements self::Animal {
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::Cat && this.{self::Cat::numberOfLegs}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfLegs}) && this.{self::Cat::numberOfWhiskers}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfWhiskers});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_implements_non_value.dartCat".{core::String::hashCode}, this.{self::Cat::numberOfLegs}.{core::num::hashCode}), this.{self::Cat::numberOfWhiskers}.{core::num::hashCode}));
}
abstract class Animal2 extends core::Object {
synthetic constructor •() → self::Animal2
@ -104,6 +107,8 @@ class Cat2 extends core::Object implements self::Animal2 {
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::Cat2 && this.{self::Cat2::numberOfLegs}.{core::num::==}(other{self::Cat2}.{self::Cat2::numberOfLegs}) && this.{self::Cat2::numberOfWhiskers}.{core::num::==}(other{self::Cat2}.{self::Cat2::numberOfWhiskers});
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_implements_non_value.dartCat2".{core::String::hashCode}, this.{self::Cat2::numberOfLegs}.{core::num::hashCode}), this.{self::Cat2::numberOfWhiskers}.{core::num::hashCode}));
}
static method main() → dynamic {
self::Cat firstCat = invalid-expression "pkg/front_end/testcases/value_class/value_implements_non_value.dart:30:22: Error: No named parameter with the name 'numberOfLegs'.
@ -201,11 +206,11 @@ static method main() → dynamic {
}
library /*isNonNullableByDefault*/;
import self as self3;
import self as val;
import "dart:core" as core;
class JenkinsSmiHash extends core::Object {
synthetic constructor •() → self3::JenkinsSmiHash
synthetic constructor •() → val::JenkinsSmiHash
: super core::Object::•()
;
static method combine(core::int hash, core::int value) → core::int {

View file

@ -1,6 +1,7 @@
library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
import "value_class_support_lib.dart" as val;
import "org-dartlang-testcase:///value_class_support_lib.dart";
@ -10,6 +11,8 @@ class A extends core::Object {
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::A;
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_mixin_error.dartA".{core::String::hashCode});
}
class B extends core::Object {
synthetic constructor •() → self::B
@ -39,11 +42,11 @@ class D extends self::_D&A&B {
static method main() → dynamic {}
library /*isNonNullableByDefault*/;
import self as self2;
import self as val;
import "dart:core" as core;
class JenkinsSmiHash extends core::Object {
synthetic constructor •() → self2::JenkinsSmiHash
synthetic constructor •() → val::JenkinsSmiHash
: super core::Object::•()
;
static method combine(core::int hash, core::int value) → core::int {

View file

@ -1,6 +1,7 @@
library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
import "value_class_support_lib.dart" as val;
import "org-dartlang-testcase:///value_class_support_lib.dart";
@ -10,6 +11,8 @@ class A extends core::Object {
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::A;
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_mixin_error.dartA".{core::String::hashCode});
}
class B extends core::Object {
synthetic constructor •() → self::B
@ -22,6 +25,8 @@ abstract class _C&B&A extends self::B implements self::A /*isAnonymousMixin,isEl
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::A;
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_mixin_error.dartA".{core::String::hashCode});
}
class C extends self::_C&B&A {
synthetic constructor •() → self::C
@ -41,11 +46,11 @@ class D extends self::_D&A&B {
static method main() → dynamic {}
library /*isNonNullableByDefault*/;
import self as self2;
import self as val;
import "dart:core" as core;
class JenkinsSmiHash extends core::Object {
synthetic constructor •() → self2::JenkinsSmiHash
synthetic constructor •() → val::JenkinsSmiHash
: super core::Object::•()
;
static method combine(core::int hash, core::int value) → core::int {

View file

@ -1,6 +1,7 @@
library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
import "value_class_support_lib.dart" as val;
import "org-dartlang-testcase:///value_class_support_lib.dart";
@ -10,6 +11,8 @@ class A extends core::Object {
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::A;
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_mixin_error.dartA".{core::String::hashCode});
}
class B extends core::Object {
synthetic constructor •() → self::B
@ -39,11 +42,11 @@ class D extends self::_D&A&B {
static method main() → dynamic {}
library /*isNonNullableByDefault*/;
import self as self2;
import self as val;
import "dart:core" as core;
class JenkinsSmiHash extends core::Object {
synthetic constructor •() → self2::JenkinsSmiHash
synthetic constructor •() → val::JenkinsSmiHash
: super core::Object::•()
;
static method combine(core::int hash, core::int value) → core::int {

View file

@ -1,6 +1,7 @@
library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
import "value_class_support_lib.dart" as val;
import "org-dartlang-testcase:///value_class_support_lib.dart";
@ -10,6 +11,8 @@ class A extends core::Object {
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::A;
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_mixin_error.dartA".{core::String::hashCode});
}
class B extends core::Object {
synthetic constructor •() → self::B
@ -22,6 +25,8 @@ abstract class _C&B&A extends self::B implements self::A /*isAnonymousMixin,isEl
;
operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
return other is self::A;
get /*isNullableByDefault*/ hashCode() → core::int
return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_mixin_error.dartA".{core::String::hashCode});
}
class C extends self::_C&B&A {
synthetic constructor •() → self::C
@ -41,11 +46,11 @@ class D extends self::_D&A&B {
static method main() → dynamic {}
library /*isNonNullableByDefault*/;
import self as self2;
import self as val;
import "dart:core" as core;
class JenkinsSmiHash extends core::Object {
synthetic constructor •() → self2::JenkinsSmiHash
synthetic constructor •() → val::JenkinsSmiHash
: super core::Object::•()
;
static method combine(core::int hash, core::int value) → core::int {

View file

@ -27,25 +27,136 @@ abstract class ClassScanner<Y extends TreeNode> implements Scanner<Class, Y> {
ScanResult<Class, Y> scan(TreeNode node) {
ScanResult<Class, Y> result = new ScanResult();
result.targets = new Map();
if (node is Class) {
if (predicate(node)) {
result.targets[node] = next?.scan(node);
}
} else if (node is Library) {
for (Class cls in node.classes) {
if (predicate(cls)) {
result.targets[cls] = next?.scan(cls);
}
}
_scanLibrary(node, result);
} else if (node is Component) {
for (Library library in node.libraries) {
for (Class cls in library.classes) {
if (predicate(cls)) {
result.targets[cls] = next?.scan(cls);
}
}
}
_scanComponent(node, result);
}
return result;
}
void _scanLibrary(Library library, ScanResult<Class, Y> result) {
for (Class cls in library.classes) {
if (predicate(cls)) {
result.targets[cls] = next?.scan(cls);
}
}
}
void _scanComponent(Component component, ScanResult<Class, Y> result) {
for (Library library in component.libraries) {
_scanLibrary(library, result);
}
}
}
abstract class FieldScanner<Y extends TreeNode> implements Scanner<Field, Y> {
final Scanner<Y, TreeNode> next;
FieldScanner(this.next);
bool predicate(Field node);
ScanResult<Field, Y> scan(TreeNode node) {
ScanResult<Field, Y> result = new ScanResult();
result.targets = new Map();
if (node is Field) {
if (predicate(node)) {
result.targets[node] = next?.scan(node);
}
} else if (node is Class) {
_scanClass(node, result);
} else if (node is Library) {
_scanLibrary(node, result);
} else if (node is Component) {
_scanComponent(node, result);
}
return result;
}
void _scanClass(Class cls, ScanResult<Field, Y> result) {
for (Field field in cls.fields) {
if (predicate(field)) {
result.targets[field] = next?.scan(field);
}
}
}
void _scanLibrary(Library library, ScanResult<Field, Y> result) {
for (Class cls in library.classes) {
_scanClass(cls, result);
}
for (Field field in library.fields) {
if (predicate(field)) {
result.targets[field] = next?.scan(field);
}
}
}
void _scanComponent(Component component, ScanResult<Field, Y> result) {
for (Library library in component.libraries) {
_scanLibrary(library, result);
}
}
}
abstract class ProcedureScanner<Y extends TreeNode>
implements Scanner<Procedure, Y> {
final Scanner<Y, TreeNode> next;
ProcedureScanner(this.next);
bool predicate(Procedure node);
ScanResult<Procedure, Y> scan(TreeNode node) {
ScanResult<Procedure, Y> result = new ScanResult();
result.targets = new Map();
if (node is Procedure) {
if (predicate(node)) {
result.targets[node] = next?.scan(node);
}
} else if (node is Class) {
_scanClass(node, result);
} else if (node is Library) {
_scanLibrary(node, result);
} else if (node is Component) {
_scanComponent(node, result);
}
return result;
}
void _scanClass(Class cls, ScanResult<Procedure, Y> result) {
for (Procedure procedure in cls.procedures) {
if (predicate(procedure)) {
result.targets[procedure] = next?.scan(procedure);
}
}
}
void _scanLibrary(Library library, ScanResult<Procedure, Y> result) {
for (Class cls in library.classes) {
_scanClass(cls, result);
}
for (Procedure procedure in library.procedures) {
if (predicate(procedure)) {
result.targets[procedure] = next?.scan(procedure);
}
}
}
void _scanComponent(Component component, ScanResult<Procedure, Y> result) {
for (Library library in component.libraries) {
_scanLibrary(library, result);
}
}
}

View file

@ -27,6 +27,22 @@ class ValueClassScanner extends ClassScanner<Null> {
}
}
class JenkinsClassScanner extends ClassScanner<Procedure> {
JenkinsClassScanner(Scanner<Procedure, TreeNode> next) : super(next);
bool predicate(Class node) {
return node.name == "JenkinsSmiHash";
}
}
class HashCombineMethodsScanner extends ProcedureScanner<Null> {
HashCombineMethodsScanner() : super(null);
bool predicate(Procedure node) {
return node.name.name == "combine" || node.name.name == "finish";
}
}
void transformComponent(
Component node, CoreTypes coreTypes, ClassHierarchy hierarchy) {
ValueClassScanner scanner = new ValueClassScanner();
@ -40,7 +56,7 @@ void transformValueClass(
Class cls, CoreTypes coreTypes, ClassHierarchy hierarchy) {
addConstructor(cls, coreTypes);
addEqualsOperator(cls, coreTypes, hierarchy);
// addHashCode(cls, coreTypes);
addHashCode(cls, coreTypes, hierarchy);
// addCopyWith(cls);
}
@ -170,34 +186,90 @@ void addEqualsOperator(
cls.addMember(equalsOperator);
}
/*
void addHashCode(Class cls, CoreTypes coreTypes) {
Map<String, VariableDeclaration> environment = Map.fromIterable(cls.fields,
key: (f) => f.name.name,
value: (f) => VariableDeclaration(f.name.name, type: f.type));
void addHashCode(Class cls, CoreTypes coreTypes, ClassHierarchy hierarchy) {
for (Procedure procedure in cls.procedures) {
if (procedure.kind == ProcedureKind.Getter &&
procedure.name.name == "hashCode") {
// hashCode getter is already implemented, spec is to do nothing
return;
}
}
DartType returnType = cls.enclosingLibrary.isNonNullableByDefault
? coreTypes.intNonNullableRawType
: coreTypes.intLegacyRawType;
VariableDeclaration other = VariableDeclaration("other");
Constructor superConstructor = null;
for (Constructor constructor in cls.superclass.constructors) {
if (constructor.name.name == "") {
superConstructor = constructor;
}
}
var returnType = cls.enclosingLibrary.isNonNullableByDefault
? coreTypes.boolNonNullableRawType
: coreTypes.boolLegacyRawType;
Procedure hashCombine, hashFinish;
HashCombineMethodsScanner hashCombineMethodsScanner =
new HashCombineMethodsScanner();
JenkinsClassScanner jenkinsScanner =
new JenkinsClassScanner(hashCombineMethodsScanner);
ScanResult<Class, Procedure> hashMethodsResult =
jenkinsScanner.scan(cls.enclosingLibrary.enclosingComponent);
for (Class clazz in hashMethodsResult.targets.keys) {
for (Procedure procedure in hashMethodsResult.targets[clazz].targets.keys) {
if (procedure.name.name == "combine") hashCombine = procedure;
if (procedure.name.name == "finish") hashFinish = procedure;
}
}
List<VariableDeclaration> allVariables = superConstructor
.function.namedParameters
.map<VariableDeclaration>(
(f) => VariableDeclaration(f.name, type: f.type))
.toList()
..addAll(cls.fields.map<VariableDeclaration>(
(f) => VariableDeclaration(f.name.name, type: f.type)));
Map<VariableDeclaration, Member> targetsHashcode = new Map();
Map<VariableDeclaration, Member> targets = new Map();
for (VariableDeclaration variable in allVariables) {
Member target = coreTypes.objectEquals;
Member targetHashcode = coreTypes.objectEquals;
DartType fieldsType = variable.type;
if (fieldsType is InterfaceType) {
targetHashcode =
hierarchy.getInterfaceMember(fieldsType.classNode, Name("hashCode"));
target = hierarchy.getInterfaceMember(cls, Name(variable.name));
}
targetsHashcode[variable] = targetHashcode;
targets[variable] = target;
}
cls.addMember(Procedure(
Name("hashCode"),
ProcedureKind.Getter,
FunctionNode(ReturnStatement(cls.fields
.map((f) => DirectPropertyGet(
VariableGet(environment[f.name.name]),
Procedure(Name("hashCode"), ProcedureKind.Getter,
null) // TODO(jlcontreras): Add ref to the real hashCode getter, dont create a new one
))
.toList()
.fold(
IntLiteral(0),
(previousValue, element) => MethodInvocation(
previousValue, Name("*"), Arguments([element])))))));
FunctionNode(
ReturnStatement(StaticInvocation(
hashFinish,
Arguments([
allVariables
.map((f) => (PropertyGet(
PropertyGet(ThisExpression(), Name(f.name), targets[f]),
Name("hashCode"),
targetsHashcode[f])))
.fold(
PropertyGet(
StringLiteral(
cls.enclosingLibrary.importUri.toString() +
cls.name),
Name("hashCode"),
hierarchy.getInterfaceMember(
coreTypes.stringClass, Name("hashCode"))),
(previousValue, element) => StaticInvocation(
hashCombine, Arguments([previousValue, element])))
]))),
returnType: returnType),
fileUri: cls.fileUri)
..fileOffset = cls.fileOffset);
}
/*
void addCopyWith(Class cls) {
Map<String, VariableDeclaration> environment = Map.fromIterable(cls.fields,
key: (f) => f.name.name,
@ -228,16 +300,3 @@ void addCopyWith(Class cls) {
cls.fields.map((f) => environment[f.name.name]).toList())));
}
*/
bool isValueClass(Class cls) {
for (Expression annotation in cls.annotations) {
if (annotation is ConstantExpression &&
annotation.constant is StringConstant) {
StringConstant constant = annotation.constant;
if (constant.value == 'valueClass') {
return true;
}
}
}
return false;
}