Skip to content

Commit e5c8fed

Browse files
committed
[ty] Experiment with reducing struct size
1 parent bd477d9 commit e5c8fed

File tree

2 files changed

+42
-57
lines changed

2 files changed

+42
-57
lines changed

crates/ty_python_semantic/src/semantic_index/builder.rs

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -769,12 +769,7 @@ impl<'db, 'ast> SemanticIndexBuilder<'db, 'ast> {
769769
self.add_standalone_type_expression(&ann_assign.annotation);
770770
let assignment = self.add_definition(
771771
place_id,
772-
AnnotatedAssignmentDefinitionNodeRef {
773-
node: ann_assign,
774-
annotation: &ann_assign.annotation,
775-
value: ann_assign.value.as_deref(),
776-
target: expr,
777-
},
772+
AnnotatedAssignmentDefinitionNodeRef { node: ann_assign },
778773
);
779774

780775
if let Some(value) = ann_assign.value.as_deref() {
@@ -1986,7 +1981,7 @@ impl<'ast> Visitor<'ast> for SemanticIndexBuilder<'_, 'ast> {
19861981
// Record whether this is equivalent to `from . import ...`
19871982
is_self_import = module_name == thispackage;
19881983

1989-
if let Some(module_node) = &node.module
1984+
if node.module.is_some()
19901985
&& let Some(relative_submodule) = module_name.relative_to(&thispackage)
19911986
&& let Some(direct_submodule) = relative_submodule.components().next()
19921987
&& !self.seen_submodule_imports.contains(direct_submodule)
@@ -2009,11 +2004,7 @@ impl<'ast> Visitor<'ast> for SemanticIndexBuilder<'_, 'ast> {
20092004
};
20102005
self.add_definition(
20112006
symbol.into(),
2012-
ImportFromSubmoduleDefinitionNodeRef {
2013-
node,
2014-
module: module_node,
2015-
module_index,
2016-
},
2007+
ImportFromSubmoduleDefinitionNodeRef { node, module_index },
20172008
);
20182009
}
20192010
}

crates/ty_python_semantic/src/semantic_index/definition.rs

Lines changed: 39 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -434,7 +434,6 @@ pub(crate) struct ImportFromDefinitionNodeRef<'ast> {
434434
#[derive(Copy, Clone, Debug)]
435435
pub(crate) struct ImportFromSubmoduleDefinitionNodeRef<'ast> {
436436
pub(crate) node: &'ast ast::StmtImportFrom,
437-
pub(crate) module: &'ast ast::Identifier,
438437
pub(crate) module_index: usize,
439438
}
440439

@@ -448,9 +447,6 @@ pub(crate) struct AssignmentDefinitionNodeRef<'ast, 'db> {
448447
#[derive(Copy, Clone, Debug)]
449448
pub(crate) struct AnnotatedAssignmentDefinitionNodeRef<'ast> {
450449
pub(crate) node: &'ast ast::StmtAnnAssign,
451-
pub(crate) annotation: &'ast ast::Expr,
452-
pub(crate) value: Option<&'ast ast::Expr>,
453-
pub(crate) target: &'ast ast::Expr,
454450
}
455451

456452
#[derive(Copy, Clone, Debug)]
@@ -538,11 +534,9 @@ impl<'db> DefinitionNodeRef<'_, 'db> {
538534
}),
539535
DefinitionNodeRef::ImportFromSubmodule(ImportFromSubmoduleDefinitionNodeRef {
540536
node,
541-
module,
542537
module_index,
543538
}) => DefinitionKind::ImportFromSubmodule(ImportFromSubmoduleDefinitionKind {
544539
node: AstNodeRef::new(parsed, node),
545-
module: AstNodeRef::new(parsed, module),
546540
module_index,
547541
}),
548542
DefinitionNodeRef::ImportStar(star_import) => {
@@ -574,14 +568,9 @@ impl<'db> DefinitionNodeRef<'_, 'db> {
574568
target: AstNodeRef::new(parsed, target),
575569
}),
576570
DefinitionNodeRef::AnnotatedAssignment(AnnotatedAssignmentDefinitionNodeRef {
577-
node: _,
578-
annotation,
579-
value,
580-
target,
571+
node,
581572
}) => DefinitionKind::AnnotatedAssignment(AnnotatedAssignmentDefinitionKind {
582-
target: AstNodeRef::new(parsed, target),
583-
annotation: AstNodeRef::new(parsed, annotation),
584-
value: value.map(|v| AstNodeRef::new(parsed, v)),
573+
node: AstNodeRef::new(parsed, node),
585574
}),
586575
DefinitionNodeRef::AugmentedAssignment(augmented_assignment) => {
587576
DefinitionKind::AugmentedAssignment(AstNodeRef::new(parsed, augmented_assignment))
@@ -896,15 +885,15 @@ impl DefinitionKind<'_> {
896885
DefinitionKind::Class(class) => class.node(module).name.range(),
897886
DefinitionKind::TypeAlias(type_alias) => type_alias.node(module).name.range(),
898887
DefinitionKind::NamedExpression(named) => named.node(module).target.range(),
899-
DefinitionKind::Assignment(assignment) => assignment.target.node(module).range(),
900-
DefinitionKind::AnnotatedAssignment(assign) => assign.target.node(module).range(),
888+
DefinitionKind::Assignment(assignment) => assignment.target(module).range(),
889+
DefinitionKind::AnnotatedAssignment(assign) => assign.target(module).range(),
901890
DefinitionKind::AugmentedAssignment(aug_assign) => {
902891
aug_assign.node(module).target.range()
903892
}
904893
DefinitionKind::DictKeyAssignment(dict_key_assignment) => {
905-
dict_key_assignment.key.node(module).range()
894+
dict_key_assignment.key(module).range()
906895
}
907-
DefinitionKind::For(for_stmt) => for_stmt.target.node(module).range(),
896+
DefinitionKind::For(for_stmt) => for_stmt.target(module).range(),
908897
DefinitionKind::Comprehension(comp) => comp.target(module).range(),
909898
DefinitionKind::VariadicPositionalParameter(parameter) => {
910899
parameter.node(module).name.range()
@@ -913,10 +902,8 @@ impl DefinitionKind<'_> {
913902
parameter.node(module).name.range()
914903
}
915904
DefinitionKind::Parameter(parameter) => parameter.node(module).parameter.name.range(),
916-
DefinitionKind::WithItem(with_item) => with_item.target.node(module).range(),
917-
DefinitionKind::MatchPattern(match_pattern) => {
918-
match_pattern.identifier.node(module).range()
919-
}
905+
DefinitionKind::WithItem(with_item) => with_item.target(module).range(),
906+
DefinitionKind::MatchPattern(match_pattern) => match_pattern.identifier(module).range(),
920907
DefinitionKind::ExceptHandler(handler) => handler
921908
.node(module)
922909
.name
@@ -943,35 +930,33 @@ impl DefinitionKind<'_> {
943930
DefinitionKind::TypeAlias(type_alias) => type_alias.node(module).range(),
944931
DefinitionKind::NamedExpression(named) => named.node(module).range(),
945932
DefinitionKind::Assignment(assign) => {
946-
let target_range = assign.target.node(module).range();
947-
let value_range = assign.value.node(module).range();
933+
let target_range = assign.target(module).range();
934+
let value_range = assign.value(module).range();
948935
target_range.cover(value_range)
949936
}
950937
DefinitionKind::AnnotatedAssignment(assign) => {
951-
let mut full_range = assign.target.node(module).range();
952-
full_range = full_range.cover(assign.annotation.node(module).range());
938+
let mut full_range = assign.target(module).range();
939+
full_range = full_range.cover(assign.annotation(module).range());
953940

954-
if let Some(ref value) = assign.value {
955-
full_range = full_range.cover(value.node(module).range());
941+
if let Some(value) = assign.value(module) {
942+
full_range = full_range.cover(value.range());
956943
}
957944

958945
full_range
959946
}
960947
DefinitionKind::AugmentedAssignment(aug_assign) => aug_assign.node(module).range(),
961948
DefinitionKind::DictKeyAssignment(dict_key_assignment) => {
962-
dict_key_assignment.key.node(module).range()
949+
dict_key_assignment.key(module).range()
963950
}
964-
DefinitionKind::For(for_stmt) => for_stmt.target.node(module).range(),
951+
DefinitionKind::For(for_stmt) => for_stmt.target(module).range(),
965952
DefinitionKind::Comprehension(comp) => comp.target(module).range(),
966953
DefinitionKind::VariadicPositionalParameter(parameter) => {
967954
parameter.node(module).range()
968955
}
969956
DefinitionKind::VariadicKeywordParameter(parameter) => parameter.node(module).range(),
970957
DefinitionKind::Parameter(parameter) => parameter.node(module).parameter.range(),
971-
DefinitionKind::WithItem(with_item) => with_item.target.node(module).range(),
972-
DefinitionKind::MatchPattern(match_pattern) => {
973-
match_pattern.identifier.node(module).range()
974-
}
958+
DefinitionKind::WithItem(with_item) => with_item.target(module).range(),
959+
DefinitionKind::MatchPattern(match_pattern) => match_pattern.identifier(module).range(),
975960
DefinitionKind::ExceptHandler(handler) => handler.node(module).range(),
976961
DefinitionKind::TypeVar(type_var) => type_var.node(module).range(),
977962
DefinitionKind::ParamSpec(param_spec) => param_spec.node(module).range(),
@@ -1017,7 +1002,7 @@ impl DefinitionKind<'_> {
10171002
// Annotated assignment is always a declaration. It is also a binding if there is a RHS
10181003
// or if we are in a stub file. Unfortunately, it is common for stubs to omit even an `...` value placeholder.
10191004
DefinitionKind::AnnotatedAssignment(ann_assign) => {
1020-
if in_stub || ann_assign.value.is_some() {
1005+
if in_stub || ann_assign.value(module).is_some() {
10211006
DefinitionCategory::DeclarationAndBinding
10221007
} else {
10231008
DefinitionCategory::Declaration
@@ -1109,6 +1094,10 @@ impl MatchPatternDefinitionKind {
11091094
self.pattern.node(module)
11101095
}
11111096

1097+
pub(crate) fn identifier<'ast>(&self, module: &'ast ParsedModuleRef) -> &'ast ast::Identifier {
1098+
self.identifier.node(module)
1099+
}
1100+
11121101
pub(crate) fn index(&self) -> u32 {
11131102
self.index
11141103
}
@@ -1163,7 +1152,7 @@ impl ImportDefinitionKind {
11631152
}
11641153

11651154
pub(crate) fn alias<'ast>(&self, module: &'ast ParsedModuleRef) -> &'ast ast::Alias {
1166-
&self.node.node(module).names[self.alias_index]
1155+
&self.import(module).names[self.alias_index]
11671156
}
11681157

11691158
pub(crate) fn is_reexported(&self) -> bool {
@@ -1184,7 +1173,7 @@ impl ImportFromDefinitionKind {
11841173
}
11851174

11861175
pub(crate) fn alias<'ast>(&self, module: &'ast ParsedModuleRef) -> &'ast ast::Alias {
1187-
&self.node.node(module).names[self.alias_index]
1176+
&self.import(module).names[self.alias_index]
11881177
}
11891178

11901179
pub(crate) fn is_reexported(&self) -> bool {
@@ -1194,7 +1183,6 @@ impl ImportFromDefinitionKind {
11941183
#[derive(Clone, Debug, get_size2::GetSize)]
11951184
pub struct ImportFromSubmoduleDefinitionKind {
11961185
node: AstNodeRef<ast::StmtImportFrom>,
1197-
module: AstNodeRef<ast::Identifier>,
11981186
module_index: usize,
11991187
}
12001188

@@ -1204,15 +1192,19 @@ impl ImportFromSubmoduleDefinitionKind {
12041192
}
12051193

12061194
pub fn module<'ast>(&self, module: &'ast ParsedModuleRef) -> &'ast ast::Identifier {
1207-
self.module.node(module)
1195+
self.import(module)
1196+
.module
1197+
.as_ref()
1198+
.expect("import-from submodule definitions should always have a module identifier")
12081199
}
12091200

12101201
pub fn target_range(&self, module: &ParsedModuleRef) -> TextRange {
12111202
let module_ident = self.module(module);
12121203
let module_str = module_ident.as_str();
12131204

12141205
// Find the dot that terminates the target component.
1215-
let Some((end_offset, _)) = module_str.match_indices('.').nth(self.module_index) else {
1206+
let Some((end_offset, _)) = module_str.match_indices('.').nth(self.module_index)
1207+
else {
12161208
// This shouldn't happen but just in case, provide a safe default
12171209
return module_ident.range();
12181210
};
@@ -1253,22 +1245,24 @@ impl<'db> AssignmentDefinitionKind<'db> {
12531245

12541246
#[derive(Clone, Debug, get_size2::GetSize)]
12551247
pub struct AnnotatedAssignmentDefinitionKind {
1256-
annotation: AstNodeRef<ast::Expr>,
1257-
value: Option<AstNodeRef<ast::Expr>>,
1258-
target: AstNodeRef<ast::Expr>,
1248+
node: AstNodeRef<ast::StmtAnnAssign>,
12591249
}
12601250

12611251
impl AnnotatedAssignmentDefinitionKind {
1252+
fn node<'ast>(&self, module: &'ast ParsedModuleRef) -> &'ast ast::StmtAnnAssign {
1253+
self.node.node(module)
1254+
}
1255+
12621256
pub(crate) fn value<'ast>(&self, module: &'ast ParsedModuleRef) -> Option<&'ast ast::Expr> {
1263-
self.value.as_ref().map(|value| value.node(module))
1257+
self.node(module).value.as_deref()
12641258
}
12651259

12661260
pub(crate) fn annotation<'ast>(&self, module: &'ast ParsedModuleRef) -> &'ast ast::Expr {
1267-
self.annotation.node(module)
1261+
&self.node(module).annotation
12681262
}
12691263

12701264
pub(crate) fn target<'ast>(&self, module: &'ast ParsedModuleRef) -> &'ast ast::Expr {
1271-
self.target.node(module)
1265+
&self.node(module).target
12721266
}
12731267
}
12741268

0 commit comments

Comments
 (0)