Skip to content

Commit 454bd06

Browse files
migeed-zmeta-codesync[bot]
authored andcommitted
Add boilerplate code for new asymmetry field as property of a class
Summary: This diff only adds the plumbing. In the next diff, we will implement the algorithm. Issue: #3299 Reviewed By: yangdanny97 Differential Revision: D104536804 fbshipit-source-id: ebefd7865495198ff6939fd9f79d1d90bdabeda2
1 parent 71d168a commit 454bd06

7 files changed

Lines changed: 111 additions & 1 deletion

File tree

pyrefly/lib/alt/class/classdef.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ use crate::binding::binding::KeyClassBaseType;
3030
use crate::binding::binding::KeyClassField;
3131
use crate::binding::binding::KeyClassMetadata;
3232
use crate::binding::binding::KeyClassMro;
33+
use crate::binding::binding::KeyClassSubscriptSymmetry;
3334
use crate::error::collector::ErrorCollector;
3435
use crate::types::callable::Param;
3536
use crate::types::callable::Required;
@@ -106,6 +107,11 @@ impl<'a, Ans: LookupAnswer> AnswersSolver<'a, Ans> {
106107
.unwrap_or_else(|| Arc::new(AbstractClassMembers::recursive()))
107108
}
108109

110+
pub fn get_subscript_symmetry_for_class(&self, cls: &Class) -> Arc<bool> {
111+
self.get_from_class(cls, &KeyClassSubscriptSymmetry(cls.index()))
112+
.unwrap_or_else(|| Arc::new(true))
113+
}
114+
109115
pub fn get_base_types_for_class(&self, cls: &Class) -> Arc<ClassBases> {
110116
self.get_from_class(cls, &KeyClassBaseType(cls.index()))
111117
.unwrap_or_else(|| Arc::new(ClassBases::recursive()))

pyrefly/lib/alt/traits.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ use crate::binding::binding::BindingClassBaseType;
3737
use crate::binding::binding::BindingClassField;
3838
use crate::binding::binding::BindingClassMetadata;
3939
use crate::binding::binding::BindingClassMro;
40+
use crate::binding::binding::BindingClassSubscriptSymmetry;
4041
use crate::binding::binding::BindingClassSynthesizedFields;
4142
use crate::binding::binding::BindingConsistentOverrideCheck;
4243
use crate::binding::binding::BindingDecoratedFunction;
@@ -61,6 +62,7 @@ use crate::binding::binding::KeyClassBaseType;
6162
use crate::binding::binding::KeyClassField;
6263
use crate::binding::binding::KeyClassMetadata;
6364
use crate::binding::binding::KeyClassMro;
65+
use crate::binding::binding::KeyClassSubscriptSymmetry;
6466
use crate::binding::binding::KeyClassSynthesizedFields;
6567
use crate::binding::binding::KeyConsistentOverrideCheck;
6668
use crate::binding::binding::KeyDecoratedFunction;
@@ -494,6 +496,22 @@ impl<Ans: LookupAnswer> Solve<Ans> for KeyAbstractClassCheck {
494496
}
495497
}
496498

499+
impl<Ans: LookupAnswer> Solve<Ans> for KeyClassSubscriptSymmetry {
500+
fn solve(
501+
_answers: &AnswersSolver<Ans>,
502+
_binding: &BindingClassSubscriptSymmetry,
503+
_range: TextRange,
504+
_errors: &ErrorCollector,
505+
) -> Arc<bool> {
506+
// TODO: implement algorithm
507+
Arc::new(true)
508+
}
509+
510+
fn promote_recursive(_heap: &TypeHeap, _: Var) -> Self::Answer {
511+
true
512+
}
513+
}
514+
497515
impl<Ans: LookupAnswer> Solve<Ans> for KeyLegacyTypeParam {
498516
fn solve(
499517
answers: &AnswersSolver<Ans>,

pyrefly/lib/binding/binding.rs

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ assert_bytes!(KeyAnnotation, 12);
102102
assert_bytes!(KeyClassMetadata, 4);
103103
assert_bytes!(KeyClassMro, 4);
104104
assert_bytes!(KeyAbstractClassCheck, 4);
105+
assert_bytes!(KeyClassSubscriptSymmetry, 4);
105106
assert_words!(KeyLegacyTypeParam, 1);
106107
assert_words!(KeyYield, 1);
107108
assert_words!(KeyYieldFrom, 1);
@@ -119,6 +120,7 @@ assert_words!(BindingClassBaseType, 3);
119120
assert_words!(BindingClassMetadata, 11);
120121
assert_bytes!(BindingClassMro, 4);
121122
assert_bytes!(BindingAbstractClassCheck, 4);
123+
assert_bytes!(BindingClassSubscriptSymmetry, 4);
122124
assert_words!(BindingClassField, 11);
123125
assert_bytes!(BindingClassSynthesizedFields, 4);
124126
assert_bytes!(BindingLegacyTypeParam, 16);
@@ -150,6 +152,7 @@ pub enum AnyIdx {
150152
KeyClassMetadata(Idx<KeyClassMetadata>),
151153
KeyClassMro(Idx<KeyClassMro>),
152154
KeyAbstractClassCheck(Idx<KeyAbstractClassCheck>),
155+
KeyClassSubscriptSymmetry(Idx<KeyClassSubscriptSymmetry>),
153156
KeyLegacyTypeParam(Idx<KeyLegacyTypeParam>),
154157
KeyYield(Idx<KeyYield>),
155158
KeyYieldFrom(Idx<KeyYieldFrom>),
@@ -225,6 +228,9 @@ macro_rules! dispatch_anyidx {
225228
AnyIdx::KeyAbstractClassCheck(idx) => {
226229
$self.$method::<$crate::binding::binding::KeyAbstractClassCheck>(*idx)
227230
}
231+
AnyIdx::KeyClassSubscriptSymmetry(idx) => {
232+
$self.$method::<$crate::binding::binding::KeyClassSubscriptSymmetry>(*idx)
233+
}
228234
AnyIdx::KeyLegacyTypeParam(idx) => {
229235
$self.$method::<$crate::binding::binding::KeyLegacyTypeParam>(*idx)
230236
}
@@ -295,6 +301,9 @@ macro_rules! dispatch_anyidx {
295301
AnyIdx::KeyAbstractClassCheck(idx) => {
296302
$self.$method::<$crate::binding::binding::KeyAbstractClassCheck>(*idx, $($args),+)
297303
}
304+
AnyIdx::KeyClassSubscriptSymmetry(idx) => {
305+
$self.$method::<$crate::binding::binding::KeyClassSubscriptSymmetry>(*idx, $($args),+)
306+
}
298307
AnyIdx::KeyLegacyTypeParam(idx) => {
299308
$self.$method::<$crate::binding::binding::KeyLegacyTypeParam>(*idx, $($args),+)
300309
}
@@ -334,6 +343,7 @@ impl DisplayWith<Bindings> for AnyIdx {
334343
Self::KeyClassMetadata(idx) => write!(f, "{}", ctx.display(*idx)),
335344
Self::KeyClassMro(idx) => write!(f, "{}", ctx.display(*idx)),
336345
Self::KeyAbstractClassCheck(idx) => write!(f, "{}", ctx.display(*idx)),
346+
Self::KeyClassSubscriptSymmetry(idx) => write!(f, "{}", ctx.display(*idx)),
337347
Self::KeyLegacyTypeParam(idx) => write!(f, "{}", ctx.display(*idx)),
338348
Self::KeyYield(idx) => write!(f, "{}", ctx.display(*idx)),
339349
Self::KeyYieldFrom(idx) => write!(f, "{}", ctx.display(*idx)),
@@ -354,6 +364,7 @@ pub enum AnyExportedKey {
354364
KeyClassMetadata(KeyClassMetadata),
355365
KeyClassMro(KeyClassMro),
356366
KeyAbstractClassCheck(KeyAbstractClassCheck),
367+
KeyClassSubscriptSymmetry(KeyClassSubscriptSymmetry),
357368
KeyTypeAlias(KeyTypeAlias),
358369
}
359370

@@ -741,6 +752,28 @@ impl Exported for KeyAbstractClassCheck {
741752
AnyExportedKey::KeyAbstractClassCheck(self.clone())
742753
}
743754
}
755+
impl Keyed for KeyClassSubscriptSymmetry {
756+
const EXPORTED: bool = true;
757+
type Value = BindingClassSubscriptSymmetry;
758+
type Answer = bool;
759+
fn to_anyidx(idx: Idx<Self>) -> AnyIdx {
760+
AnyIdx::KeyClassSubscriptSymmetry(idx)
761+
}
762+
fn range_with(idx: Idx<Self>, bindings: &Bindings) -> TextRange
763+
where
764+
BindingTable: TableKeyed<Self, Value = BindingEntry<Self>>,
765+
{
766+
bindings.idx_to_key(bindings.get(idx).class_idx).range()
767+
}
768+
fn try_to_anykey(&self) -> Option<AnyExportedKey> {
769+
Some(AnyExportedKey::KeyClassSubscriptSymmetry(self.clone()))
770+
}
771+
}
772+
impl Exported for KeyClassSubscriptSymmetry {
773+
fn to_anykey(&self) -> AnyExportedKey {
774+
AnyExportedKey::KeyClassSubscriptSymmetry(self.clone())
775+
}
776+
}
744777
impl Keyed for KeyLegacyTypeParam {
745778
type Value = BindingLegacyTypeParam;
746779
type Answer = LegacyTypeParameterLookup;
@@ -1599,6 +1632,15 @@ impl DisplayWith<ModuleInfo> for KeyAbstractClassCheck {
15991632
}
16001633
}
16011634

1635+
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
1636+
pub struct KeyClassSubscriptSymmetry(pub ClassDefIndex);
1637+
1638+
impl DisplayWith<ModuleInfo> for KeyClassSubscriptSymmetry {
1639+
fn fmt(&self, f: &mut fmt::Formatter<'_>, _ctx: &ModuleInfo) -> fmt::Result {
1640+
write!(f, "KeyClassSubscriptSymmetry(class{})", self.0)
1641+
}
1642+
}
1643+
16021644
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
16031645
pub struct KeyLegacyTypeParam(pub ShortIdentifier);
16041646

@@ -3118,6 +3160,21 @@ impl DisplayWith<Bindings> for BindingAbstractClassCheck {
31183160
}
31193161
}
31203162

3163+
#[derive(Clone, Debug)]
3164+
pub struct BindingClassSubscriptSymmetry {
3165+
pub class_idx: Idx<KeyClass>,
3166+
}
3167+
3168+
impl DisplayWith<Bindings> for BindingClassSubscriptSymmetry {
3169+
fn fmt(&self, f: &mut fmt::Formatter<'_>, ctx: &Bindings) -> fmt::Result {
3170+
write!(
3171+
f,
3172+
"BindingClassSubscriptSymmetry({})",
3173+
ctx.display(self.class_idx)
3174+
)
3175+
}
3176+
}
3177+
31213178
#[derive(Clone, Debug)]
31223179
/// A legacy type parameter (`T = typing.TypeVar("T")`).
31233180
pub enum BindingLegacyTypeParam {

pyrefly/lib/binding/class.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ use crate::binding::binding::BindingClassBaseType;
4444
use crate::binding::binding::BindingClassField;
4545
use crate::binding::binding::BindingClassMetadata;
4646
use crate::binding::binding::BindingClassMro;
47+
use crate::binding::binding::BindingClassSubscriptSymmetry;
4748
use crate::binding::binding::BindingClassSynthesizedFields;
4849
use crate::binding::binding::BindingConsistentOverrideCheck;
4950
use crate::binding::binding::BindingExpect;
@@ -62,6 +63,7 @@ use crate::binding::binding::KeyClassBaseType;
6263
use crate::binding::binding::KeyClassField;
6364
use crate::binding::binding::KeyClassMetadata;
6465
use crate::binding::binding::KeyClassMro;
66+
use crate::binding::binding::KeyClassSubscriptSymmetry;
6567
use crate::binding::binding::KeyClassSynthesizedFields;
6668
use crate::binding::binding::KeyConsistentOverrideCheck;
6769
use crate::binding::binding::KeyExpect;
@@ -135,6 +137,7 @@ impl<'a> BindingsBuilder<'a> {
135137
consistent_override_check_idx: self
136138
.idx_for_promise(KeyConsistentOverrideCheck(def_index)),
137139
abstract_class_check_idx: self.idx_for_promise(KeyAbstractClassCheck(def_index)),
140+
subscript_symmetry_idx: self.idx_for_promise(KeyClassSubscriptSymmetry(def_index)),
138141
};
139142
(class_object, class_indices)
140143
}
@@ -545,6 +548,12 @@ impl<'a> BindingsBuilder<'a> {
545548
class_idx: class_indices.class_idx,
546549
},
547550
);
551+
self.insert_binding_idx(
552+
class_indices.subscript_symmetry_idx,
553+
BindingClassSubscriptSymmetry {
554+
class_idx: class_indices.class_idx,
555+
},
556+
);
548557
}
549558

550559
/// Extracts docstrings for each field, mapping the field's range to the docstring's range.
@@ -1053,6 +1062,12 @@ impl<'a> BindingsBuilder<'a> {
10531062
class_idx: class_indices.class_idx,
10541063
},
10551064
);
1065+
self.insert_binding_idx(
1066+
class_indices.subscript_symmetry_idx,
1067+
BindingClassSubscriptSymmetry {
1068+
class_idx: class_indices.class_idx,
1069+
},
1070+
);
10561071
}
10571072

10581073
pub fn synthesize_enum_def(

pyrefly/lib/binding/scope.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ use crate::binding::binding::KeyClass;
5050
use crate::binding::binding::KeyClassBaseType;
5151
use crate::binding::binding::KeyClassMetadata;
5252
use crate::binding::binding::KeyClassMro;
53+
use crate::binding::binding::KeyClassSubscriptSymmetry;
5354
use crate::binding::binding::KeyClassSynthesizedFields;
5455
use crate::binding::binding::KeyConsistentOverrideCheck;
5556
use crate::binding::binding::KeyDecoratedFunction;
@@ -896,6 +897,7 @@ pub struct ClassIndices {
896897
pub variance_check_idx: Idx<KeyVarianceCheck>,
897898
pub consistent_override_check_idx: Idx<KeyConsistentOverrideCheck>,
898899
pub abstract_class_check_idx: Idx<KeyAbstractClassCheck>,
900+
pub subscript_symmetry_idx: Idx<KeyClassSubscriptSymmetry>,
899901
}
900902

901903
#[derive(Clone, Debug)]

pyrefly/lib/binding/table.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ macro_rules! table {
4444
$($vis)* class_metadata: $t<$crate::binding::binding::KeyClassMetadata>,
4545
$($vis)* class_mros: $t<$crate::binding::binding::KeyClassMro>,
4646
$($vis)* abstract_class_check: $t<$crate::binding::binding::KeyAbstractClassCheck>,
47+
$($vis)* class_subscript_symmetry: $t<$crate::binding::binding::KeyClassSubscriptSymmetry>,
4748
$($vis)* legacy_tparams: $t<$crate::binding::binding::KeyLegacyTypeParam>,
4849
$($vis)* yields: $t<$crate::binding::binding::KeyYield>,
4950
$($vis)* yield_froms: $t<$crate::binding::binding::KeyYieldFrom>,
@@ -169,6 +170,12 @@ macro_rules! table {
169170
fn get_mut(&mut self) -> &mut Self::Value { &mut self.abstract_class_check }
170171
}
171172

173+
impl $crate::binding::table::TableKeyed<$crate::binding::binding::KeyClassSubscriptSymmetry> for $name {
174+
type Value = $t<$crate::binding::binding::KeyClassSubscriptSymmetry>;
175+
fn get(&self) -> &Self::Value { &self.class_subscript_symmetry }
176+
fn get_mut(&mut self) -> &mut Self::Value { &mut self.class_subscript_symmetry }
177+
}
178+
172179
impl $crate::binding::table::TableKeyed<$crate::binding::binding::KeyLegacyTypeParam> for $name {
173180
type Value = $t<$crate::binding::binding::KeyLegacyTypeParam>;
174181
fn get(&self) -> &Self::Value { &self.legacy_tparams }
@@ -230,6 +237,7 @@ macro_rules! table_for_each(
230237
$f(&($e).class_metadata);
231238
$f(&($e).class_mros);
232239
$f(&($e).abstract_class_check);
240+
$f(&($e).class_subscript_symmetry);
233241
$f(&($e).legacy_tparams);
234242
$f(&($e).yields);
235243
$f(&($e).yield_froms);
@@ -259,6 +267,7 @@ macro_rules! table_mut_for_each(
259267
$f(&mut ($e).class_metadata);
260268
$f(&mut ($e).class_mros);
261269
$f(&mut ($e).abstract_class_check);
270+
$f(&mut ($e).class_subscript_symmetry);
262271
$f(&mut ($e).legacy_tparams);
263272
$f(&mut ($e).yields);
264273
$f(&mut ($e).yield_froms);
@@ -288,6 +297,7 @@ macro_rules! table_try_for_each(
288297
$f(&($e).class_metadata)?;
289298
$f(&($e).class_mros)?;
290299
$f(&($e).abstract_class_check)?;
300+
$f(&($e).class_subscript_symmetry)?;
291301
$f(&($e).legacy_tparams)?;
292302
$f(&($e).yields)?;
293303
$f(&($e).yield_froms)?;

pyrefly/lib/state/state.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ use crate::binding::binding::KeyClassBaseType;
9090
use crate::binding::binding::KeyClassField;
9191
use crate::binding::binding::KeyClassMetadata;
9292
use crate::binding::binding::KeyClassMro;
93+
use crate::binding::binding::KeyClassSubscriptSymmetry;
9394
use crate::binding::binding::KeyClassSynthesizedFields;
9495
use crate::binding::binding::KeyExport;
9596
use crate::binding::binding::KeyTParams;
@@ -313,7 +314,8 @@ impl ModuleDeps {
313314
| AnyExportedKey::KeyVariance(KeyVariance(c))
314315
| AnyExportedKey::KeyClassMetadata(KeyClassMetadata(c))
315316
| AnyExportedKey::KeyClassMro(KeyClassMro(c))
316-
| AnyExportedKey::KeyAbstractClassCheck(KeyAbstractClassCheck(c)) => {
317+
| AnyExportedKey::KeyAbstractClassCheck(KeyAbstractClassCheck(c))
318+
| AnyExportedKey::KeyClassSubscriptSymmetry(KeyClassSubscriptSymmetry(c)) => {
317319
self.classes.insert(c);
318320
}
319321
}

0 commit comments

Comments
 (0)