Workaround nameclash in dbscheme generator

This commit is contained in:
Arthur Baars 2024-09-13 11:06:04 +02:00
Родитель b0939cfffa
Коммит d99c2031ac
15 изменённых файлов: 63 добавлений и 63 удалений

2
rust/extractor/src/generated/.generated.list сгенерированный
Просмотреть файл

@ -1,2 +1,2 @@
mod.rs 7cdfedcd68cf8e41134daf810c1af78624082b0c3e8be6570339b1a69a5d457e 7cdfedcd68cf8e41134daf810c1af78624082b0c3e8be6570339b1a69a5d457e
top.rs c0701de6b3caad020b72b275d83209e6fff0771f84fb94a816921ae7ca7fd3df c0701de6b3caad020b72b275d83209e6fff0771f84fb94a816921ae7ca7fd3df
top.rs c5be6a0f58f3699e51761681ea97677abfc827d264d634d8069d283dd9172353 c5be6a0f58f3699e51761681ea97677abfc827d264d634d8069d283dd9172353

12
rust/extractor/src/generated/top.rs сгенерированный
Просмотреть файл

@ -1050,7 +1050,7 @@ pub struct RecordExpr {
pub id: TrapId,
pub location: Option<trap::Label>,
pub path: Option<trap::Label>,
pub fields: Vec<trap::Label>,
pub flds: Vec<trap::Label>,
pub spread: Option<trap::Label>,
pub has_ellipsis: bool,
pub is_assignee_expr: bool,
@ -1069,8 +1069,8 @@ impl TrapEntry for RecordExpr {
if let Some(v) = self.path {
out.add_tuple("record_expr_paths", vec![trap::Arg::Label(id), v.into()]);
}
for (i, v) in self.fields.into_iter().enumerate() {
out.add_tuple("record_expr_fields", vec![trap::Arg::Label(id), i.into(), v.into()]);
for (i, v) in self.flds.into_iter().enumerate() {
out.add_tuple("record_expr_flds", vec![trap::Arg::Label(id), i.into(), v.into()]);
}
if let Some(v) = self.spread {
out.add_tuple("record_expr_spreads", vec![trap::Arg::Label(id), v.into()]);
@ -1089,7 +1089,7 @@ pub struct RecordPat {
pub id: TrapId,
pub location: Option<trap::Label>,
pub path: Option<trap::Label>,
pub args: Vec<trap::Label>,
pub flds: Vec<trap::Label>,
pub has_ellipsis: bool,
}
@ -1106,8 +1106,8 @@ impl TrapEntry for RecordPat {
if let Some(v) = self.path {
out.add_tuple("record_pat_paths", vec![trap::Arg::Label(id), v.into()]);
}
for (i, v) in self.args.into_iter().enumerate() {
out.add_tuple("record_pat_args", vec![trap::Arg::Label(id), i.into(), v.into()]);
for (i, v) in self.flds.into_iter().enumerate() {
out.add_tuple("record_pat_flds", vec![trap::Arg::Label(id), i.into(), v.into()]);
}
if self.has_ellipsis {
out.add_tuple("record_pat_has_ellipsis", vec![trap::Arg::Label(id)]);

Просмотреть файл

@ -262,7 +262,7 @@ impl CrateTranslator<'_> {
ellipsis,
} => {
let path = path.as_ref().map(|path| self.emit_path(path, location));
let args = args
let flds = args
.into_iter()
.map(|arg| self.emit_record_field_pat(arg, body, source_map))
.collect();
@ -270,7 +270,7 @@ impl CrateTranslator<'_> {
id: TrapId::Star,
location,
path,
args,
flds,
has_ellipsis: *ellipsis,
})
}
@ -691,7 +691,7 @@ impl CrateTranslator<'_> {
is_assignee_expr,
} => {
let path = path.as_ref().map(|path| self.emit_path(path, location));
let fields = fields
let flds = fields
.into_iter()
.map(|field| self.emit_record_lit_field(field, body, source_map))
.collect();
@ -700,7 +700,7 @@ impl CrateTranslator<'_> {
id: TrapId::Star,
location,
path,
fields,
flds,
spread,
has_ellipsis: *ellipsis,
is_assignee_expr: *is_assignee_expr,

16
rust/ql/.generated.list сгенерированный
Просмотреть файл

@ -185,7 +185,7 @@ lib/codeql/rust/generated/MissingPat.qll 9fa2685c9f8b285c6b2f470a2c482b3bd1f0717
lib/codeql/rust/generated/Module.qll c6007444c796654fb48fbe4a4596580f08feec2aac13932043062a170dd73f0b 0560c738dbee3937baf0f2ab661c8e4dacd69eb886635241b1ff90f2c0f4bd67
lib/codeql/rust/generated/OffsetOfExpr.qll 5f2c1d2b5d63d2a86c02c8a20fede528403f8dd267f3026ddc420e128f53c73c d4a7eb9e533a943913aa3bdc6f57d89023a0a2075681b6aaa53d5c4dd7ad764b
lib/codeql/rust/generated/OrPat.qll a9a606b001c9b3c6f5cb3d65a593cce043f49b1e8a237310c058f5293eec46a8 4b6ab0d2192c93c64a5f98b6083e91ac03fd040bead24831a1a88d274847c79d
lib/codeql/rust/generated/ParentChild.qll ffe3bb352e1530ba64a394a70541d86dbedebd004a201b94c1b15d368b127319 1c8f74ba0bebb390ee774bfe295c9b25b466e64fd6ba4a1a4f1655885ecebce6
lib/codeql/rust/generated/ParentChild.qll 1988b870c14148c2b23136dd00456d898a73d52a8cfb10039a0db414f5c01dbd bda2c0e7a5333206a6f7ab3a2c438be376c8b75f4d5810d91439cd10b88214a2
lib/codeql/rust/generated/Pat.qll b035e7866ea500232421ef9f79e7e60b90b9c27dbe47d25758548e94750d2965 adf701ad35559ea7d0284d6718ad507518778dc78100f48063e6a6bf3705c91f
lib/codeql/rust/generated/Path.qll ffd26e9e5e3878f374bc1163d6ccb47072cc1d3abd937d0206bf1a7c62c843ff ffd26e9e5e3878f374bc1163d6ccb47072cc1d3abd937d0206bf1a7c62c843ff
lib/codeql/rust/generated/PathExpr.qll 5a82e07a0c641fec4e8ce29656fa4e33f420b19b2556b418769f4d899a3dfae3 21920262735114d8304c3569f884828a390b95ca039afcc3e81c75d3f23df9ca
@ -194,10 +194,10 @@ lib/codeql/rust/generated/PrefixExpr.qll a3f6cc62e5a12acd253ea59cb6957fb7157aa70
lib/codeql/rust/generated/PureSynthConstructors.qll 5eb1fc4f6a04172c34ae31e4931e4bf1f8b72fbe414c5f644731a45372d13573 5eb1fc4f6a04172c34ae31e4931e4bf1f8b72fbe414c5f644731a45372d13573
lib/codeql/rust/generated/RangeExpr.qll 1678fa524166552a36d73cad9d34213309b1989c1e427bc990b5c11a12588ce5 beb90978cea26a2ec9d3e8cc7b0b6a728ae952212ada5d6ad19319120f3218a8
lib/codeql/rust/generated/RangePat.qll 2e96aece5ff2300659c2729c7037f7334790456d86160dc1e16ae99545c6ed0d eae4f95f9eaacbc2319ee67556dcc164527d82a6eaa5af59f6efce9caf3cba3b
lib/codeql/rust/generated/Raw.qll a6d94287077dff8af5d7d41af29589df1209cd22d996dcc41eb4c5c9084eb064 8d0159d571217c6c89b6cfd27975a9a5568051e2799e69c2d39bed9ed36822aa
lib/codeql/rust/generated/RecordExpr.qll 7099ed90ed466a3c849fa78e3c934d83e0d0fd6d8be5fb774596f5048f299478 2efb691f6f611f852253ac08be90bba6e25b695b8def83b416110ca63a790d5c
lib/codeql/rust/generated/Raw.qll c2926037fbd92b2ca637f71b91f05c48414a0e23822b324d33b74872eb28f9d1 94f35bd2248809cb3489aa7950a3e6bf5f0a0f26f4d91aa623b0589c67c9a2f8
lib/codeql/rust/generated/RecordExpr.qll bdafc10cde139617b67cb46bb205f99bc3fc0b9fd8634d304b81b524b9592aa8 2826c453c72416237467b08cf9ad9421b03203a8593420146dad8e1e71711b8a
lib/codeql/rust/generated/RecordExprField.qll eb06236fbdb856169dfe50ae1ebf59384222de6670ca91c34eed647823dda4ce 750bc7ab1e156db3927d6dd206e9d2c9388519425c0e8665afd322a6594aa5e2
lib/codeql/rust/generated/RecordPat.qll 80ea7a231c3e33c539d0fd892b1cdca63bada265650f5eeee6d76b45b091be0d 858af1b0c992af44ed148ded54c2ce7cbfcb9e747110255bccfe8dc33ca655cf
lib/codeql/rust/generated/RecordPat.qll 20b62cfd4ee4e911ad4a2b8e5762da2abb7ff0c1d7f21cc6f72b1ebcbebbcd42 c0502e6bfc637058524cf7369c63396ca5440c58e5e91600fecd35ca5299d86c
lib/codeql/rust/generated/RecordPatField.qll d862245163667ede676e407f109ad44e4ce732de59ea9025b696dd8b9803fbef 60166a21d7deee112325bc301b5893cf3072c4d8d095dbf9080cb00269b71d40
lib/codeql/rust/generated/RefExpr.qll 917d810bda28f3f4319770ae5c8eb4ae40887f3c97669fde072078d3f5536114 7793027298da1fb787f8823146507f1ccfab046977cc71743045b3c2f3b5da02
lib/codeql/rust/generated/RefPat.qll 2a451553084306acc625f0433dc02546d07a1b6174a7d614379c9e8e28550118 40b845320c68283d0f6e47f17f4d4d893ef613f41422d35663582cfa3b5e7d75
@ -295,13 +295,13 @@ test/extractor-tests/generated/RangeExpr/RangeExpr_getRhs.ql 6a7eb53c6b2a4587212
test/extractor-tests/generated/RangePat/RangePat.ql 4cb48cd2a96ecaa3998f70e2ef5b117749448d9166af743d3b8cfe6f90938665 d5a894f6e56b28c1438e37191ddd623d89e4eb07d5c979ae3795119de9d01e49
test/extractor-tests/generated/RangePat/RangePat_getEnd.ql 823307f0e43fe6c02843417d254c6584e2ead04b961158f04494eb8197b9905e 016805e6063be3846cef24a5680f4f17e68ee9714430120aa91fface3461d97c
test/extractor-tests/generated/RangePat/RangePat_getStart.ql 1457a38514bf9fa7de44a4e5e3dd5218410149133074252bdf64d5eef5197d43 e9a6393aed20c710b2f19bc6482262664d8bc0245b5dfc35f636aa7966e0dba4
test/extractor-tests/generated/RecordExpr/RecordExpr.ql f9760a715119ffa6a888c25c9d786457e1c982933524dbd5cae974c4ce36fff8 4d2b69b2f4639eb598c2642b42c2c159e00f13ceb39e6c15c5998571861f6bd0
test/extractor-tests/generated/RecordExpr/RecordExpr_getField.ql ec56578c4110cfb348c5b0e298edfe972e26af62166a3e75fbb3c307cab83436 ef69eb85a20c9de83de98babfbf158b281200527fa71fd44cbeb1a05636ed62e
test/extractor-tests/generated/RecordExpr/RecordExpr.ql 20dcdc18d2c8edeb06945915b87c77578000a67690e234c9f96d9f5520c53159 2e8d975f70a7d6ee8e9dd1c896eb95a4de079f4f4fa1031f6276e3212386c895
test/extractor-tests/generated/RecordExpr/RecordExpr_getFld.ql ef36c6fb3dd9d77c58b573661834d20d8176544137cbcd8f6c2a9c9aaa335574 d9d652ae1067dda138af2211a8b5fbc67129c571cb9c1faf5048e1e372cf1dd0
test/extractor-tests/generated/RecordExpr/RecordExpr_getPath.ql 6989f2b785813685e2233476abb13c0041a417d6a7e33179336739160f2569b7 fa1e08ee46ac863fdf69fc71b1823f18db6195aa66ea4a228c7c8eee3b448130
test/extractor-tests/generated/RecordExpr/RecordExpr_getSpread.ql d221a3847a077d3574de6ea15ccf433f1bea24baa1080eb90f9e3d104f1ba22a 97b325e5fa8bc8af4968dc96bf5930d05bb4083d7a945ab6a34a55a7016da09d
test/extractor-tests/generated/RecordExprField/RecordExprField.ql c533740aecaae604d5c7d3261aa8df511d837b19fd74b4f88897373da6d932bd 037e33faf0195cb67314f7eef9571088391586366bf71a6fef3ef83845fb573c
test/extractor-tests/generated/RecordPat/RecordPat.ql 485dab5489881a9040d841999fdc9eedd5fd34ed2c0847f9e9a8343c0d24f26d fc3a104ffd48af0d26ea3f2266f0fa5acd32278f8514b6f261a5fd77e5ff90d9
test/extractor-tests/generated/RecordPat/RecordPat_getArg.ql c23dbde4d3c8ad1ef418e06a7552390ebbc396a218a660b103d9be08a7111960 5a10690bac5446a52f2d8b0dd2c4d7dd742c4a60e91b47a5a7f617396ce0adb0
test/extractor-tests/generated/RecordPat/RecordPat.ql 54bae18e24900a8a6ada5f72334e3507c17156227afd908c1b7354c11c6bafe1 8613ce169564ce0ab912bd9b3340ff3a8040f8f3ccd56d6dfd3a56eb59a00bd8
test/extractor-tests/generated/RecordPat/RecordPat_getFld.ql 4bd86be1173bf404bc6901399be7da2b6f12d989f2ad2b158002de18b534e0e0 cbca368f9196d886affce4e1ee01bb5918c1a22a17dedd367f8cd943aefe06c2
test/extractor-tests/generated/RecordPat/RecordPat_getPath.ql d2730342a2203ad7d6385a64d53874050bd084fe74c05168df223499f7e86100 0d223ccb9c127100557b70da89f0c6ec7c559babc885bff46b97f5cb7b877e63
test/extractor-tests/generated/RecordPatField/RecordPatField.ql 70babedca815ef3a5759a398993cd20645a43d45ada0e71ba68318811274606e 24635139cc3b95bfa36921008ff1db0455257ed0a0384b10ac267dbd4a125fb9
test/extractor-tests/generated/RefExpr/RefExpr.ql e859cd59dbaa5aa5555aa13d4a75b7bfe2dbdb2d5c50675f3753adaaaabdedc2 d330ee941e9932054c32d0be5a52f38f285e4dc529821759ea38633f8ddbd517

4
rust/ql/.gitattributes сгенерированный поставляемый
Просмотреть файл

@ -298,12 +298,12 @@
/test/extractor-tests/generated/RangePat/RangePat_getEnd.ql linguist-generated
/test/extractor-tests/generated/RangePat/RangePat_getStart.ql linguist-generated
/test/extractor-tests/generated/RecordExpr/RecordExpr.ql linguist-generated
/test/extractor-tests/generated/RecordExpr/RecordExpr_getField.ql linguist-generated
/test/extractor-tests/generated/RecordExpr/RecordExpr_getFld.ql linguist-generated
/test/extractor-tests/generated/RecordExpr/RecordExpr_getPath.ql linguist-generated
/test/extractor-tests/generated/RecordExpr/RecordExpr_getSpread.ql linguist-generated
/test/extractor-tests/generated/RecordExprField/RecordExprField.ql linguist-generated
/test/extractor-tests/generated/RecordPat/RecordPat.ql linguist-generated
/test/extractor-tests/generated/RecordPat/RecordPat_getArg.ql linguist-generated
/test/extractor-tests/generated/RecordPat/RecordPat_getFld.ql linguist-generated
/test/extractor-tests/generated/RecordPat/RecordPat_getPath.ql linguist-generated
/test/extractor-tests/generated/RecordPatField/RecordPatField.ql linguist-generated
/test/extractor-tests/generated/RefExpr/RefExpr.ql linguist-generated

20
rust/ql/lib/codeql/rust/generated/ParentChild.qll сгенерированный
Просмотреть файл

@ -1008,13 +1008,13 @@ private module Impl {
}
private Element getImmediateChildOfRecordExpr(RecordExpr e, int index, string partialPredicateCall) {
exists(int b, int bExpr, int n, int nPath, int nField, int nSpread |
exists(int b, int bExpr, int n, int nPath, int nFld, int nSpread |
b = 0 and
bExpr = b + 1 + max(int i | i = -1 or exists(getImmediateChildOfExpr(e, i, _)) | i) and
n = bExpr and
nPath = n + 1 and
nField = nPath + 1 + max(int i | i = -1 or exists(e.getField(i)) | i) and
nSpread = nField + 1 and
nFld = nPath + 1 + max(int i | i = -1 or exists(e.getFld(i)) | i) and
nSpread = nFld + 1 and
(
none()
or
@ -1022,21 +1022,21 @@ private module Impl {
or
index = n and result = e.getPath() and partialPredicateCall = "Path()"
or
result = e.getField(index - nPath) and
partialPredicateCall = "Field(" + (index - nPath).toString() + ")"
result = e.getFld(index - nPath) and
partialPredicateCall = "Fld(" + (index - nPath).toString() + ")"
or
index = nField and result = e.getSpread() and partialPredicateCall = "Spread()"
index = nFld and result = e.getSpread() and partialPredicateCall = "Spread()"
)
)
}
private Element getImmediateChildOfRecordPat(RecordPat e, int index, string partialPredicateCall) {
exists(int b, int bPat, int n, int nPath, int nArg |
exists(int b, int bPat, int n, int nPath, int nFld |
b = 0 and
bPat = b + 1 + max(int i | i = -1 or exists(getImmediateChildOfPat(e, i, _)) | i) and
n = bPat and
nPath = n + 1 and
nArg = nPath + 1 + max(int i | i = -1 or exists(e.getArg(i)) | i) and
nFld = nPath + 1 + max(int i | i = -1 or exists(e.getFld(i)) | i) and
(
none()
or
@ -1044,8 +1044,8 @@ private module Impl {
or
index = n and result = e.getPath() and partialPredicateCall = "Path()"
or
result = e.getArg(index - nPath) and
partialPredicateCall = "Arg(" + (index - nPath).toString() + ")"
result = e.getFld(index - nPath) and
partialPredicateCall = "Fld(" + (index - nPath).toString() + ")"
)
)
}

8
rust/ql/lib/codeql/rust/generated/Raw.qll сгенерированный
Просмотреть файл

@ -1174,9 +1174,9 @@ module Raw {
Path getPath() { record_expr_paths(this, result) }
/**
* Gets the `index`th field of this record expression (0-based).
* Gets the `index`th fld of this record expression (0-based).
*/
RecordExprField getField(int index) { record_expr_fields(this, index, result) }
RecordExprField getFld(int index) { record_expr_flds(this, index, result) }
/**
* Gets the spread of this record expression, if it exists.
@ -1213,9 +1213,9 @@ module Raw {
Path getPath() { record_pat_paths(this, result) }
/**
* Gets the `index`th argument of this record pat (0-based).
* Gets the `index`th fld of this record pat (0-based).
*/
RecordPatField getArg(int index) { record_pat_args(this, index, result) }
RecordPatField getFld(int index) { record_pat_flds(this, index, result) }
/**
* Holds if this record pat has ellipsis.

14
rust/ql/lib/codeql/rust/generated/RecordExpr.qll сгенерированный
Просмотреть файл

@ -43,24 +43,24 @@ module Generated {
final predicate hasPath() { exists(this.getPath()) }
/**
* Gets the `index`th field of this record expression (0-based).
* Gets the `index`th fld of this record expression (0-based).
*/
RecordExprField getField(int index) {
RecordExprField getFld(int index) {
result =
Synth::convertRecordExprFieldFromRaw(Synth::convertRecordExprToRaw(this)
.(Raw::RecordExpr)
.getField(index))
.getFld(index))
}
/**
* Gets any of the fields of this record expression.
* Gets any of the flds of this record expression.
*/
final RecordExprField getAField() { result = this.getField(_) }
final RecordExprField getAFld() { result = this.getFld(_) }
/**
* Gets the number of fields of this record expression.
* Gets the number of flds of this record expression.
*/
final int getNumberOfFields() { result = count(int i | exists(this.getField(i))) }
final int getNumberOfFlds() { result = count(int i | exists(this.getFld(i))) }
/**
* Gets the spread of this record expression, if it exists.

14
rust/ql/lib/codeql/rust/generated/RecordPat.qll сгенерированный
Просмотреть файл

@ -43,24 +43,24 @@ module Generated {
final predicate hasPath() { exists(this.getPath()) }
/**
* Gets the `index`th argument of this record pat (0-based).
* Gets the `index`th fld of this record pat (0-based).
*/
RecordPatField getArg(int index) {
RecordPatField getFld(int index) {
result =
Synth::convertRecordPatFieldFromRaw(Synth::convertRecordPatToRaw(this)
.(Raw::RecordPat)
.getArg(index))
.getFld(index))
}
/**
* Gets any of the arguments of this record pat.
* Gets any of the flds of this record pat.
*/
final RecordPatField getAnArg() { result = this.getArg(_) }
final RecordPatField getAFld() { result = this.getFld(_) }
/**
* Gets the number of arguments of this record pat.
* Gets the number of flds of this record pat.
*/
final int getNumberOfArgs() { result = count(int i | exists(this.getArg(i))) }
final int getNumberOfFlds() { result = count(int i | exists(this.getFld(i))) }
/**
* Holds if this record pat has ellipsis.

Просмотреть файл

@ -584,10 +584,10 @@ record_expr_paths(
);
#keyset[id, index]
record_expr_fields(
record_expr_flds(
int id: @record_expr ref,
int index: int ref,
int field: @record_expr_field ref
int fld: @record_expr_field ref
);
#keyset[id]
@ -617,10 +617,10 @@ record_pat_paths(
);
#keyset[id, index]
record_pat_args(
record_pat_flds(
int id: @record_pat ref,
int index: int ref,
int arg: @record_pat_field ref
int fld: @record_pat_field ref
);
#keyset[id]

Просмотреть файл

@ -3,15 +3,15 @@ import codeql.rust.elements
import TestUtils
from
RecordExpr x, string hasPath, int getNumberOfFields, string hasSpread, string hasEllipsis,
RecordExpr x, string hasPath, int getNumberOfFlds, string hasSpread, string hasEllipsis,
string isAssigneeExpr
where
toBeTested(x) and
not x.isUnknown() and
(if x.hasPath() then hasPath = "yes" else hasPath = "no") and
getNumberOfFields = x.getNumberOfFields() and
getNumberOfFlds = x.getNumberOfFlds() and
(if x.hasSpread() then hasSpread = "yes" else hasSpread = "no") and
(if x.hasEllipsis() then hasEllipsis = "yes" else hasEllipsis = "no") and
if x.isAssigneeExpr() then isAssigneeExpr = "yes" else isAssigneeExpr = "no"
select x, "hasPath:", hasPath, "getNumberOfFields:", getNumberOfFields, "hasSpread:", hasSpread,
select x, "hasPath:", hasPath, "getNumberOfFlds:", getNumberOfFlds, "hasSpread:", hasSpread,
"hasEllipsis:", hasEllipsis, "isAssigneeExpr:", isAssigneeExpr

Просмотреть файл

@ -4,4 +4,4 @@ import TestUtils
from RecordExpr x, int index
where toBeTested(x) and not x.isUnknown()
select x, index, x.getField(index)
select x, index, x.getFld(index)

Просмотреть файл

@ -2,11 +2,11 @@
import codeql.rust.elements
import TestUtils
from RecordPat x, string hasPath, int getNumberOfArgs, string hasEllipsis
from RecordPat x, string hasPath, int getNumberOfFlds, string hasEllipsis
where
toBeTested(x) and
not x.isUnknown() and
(if x.hasPath() then hasPath = "yes" else hasPath = "no") and
getNumberOfArgs = x.getNumberOfArgs() and
getNumberOfFlds = x.getNumberOfFlds() and
if x.hasEllipsis() then hasEllipsis = "yes" else hasEllipsis = "no"
select x, "hasPath:", hasPath, "getNumberOfArgs:", getNumberOfArgs, "hasEllipsis:", hasEllipsis
select x, "hasPath:", hasPath, "getNumberOfFlds:", getNumberOfFlds, "hasEllipsis:", hasEllipsis

Просмотреть файл

@ -4,4 +4,4 @@ import TestUtils
from RecordPat x, int index
where toBeTested(x) and not x.isUnknown()
select x, index, x.getArg(index)
select x, index, x.getFld(index)

Просмотреть файл

@ -536,7 +536,7 @@ class RecordExpr(Expr):
```
"""
path: optional[Path] | child
fields: list[RecordExprField] | child
flds: list[RecordExprField] | child
spread: optional[Expr] | child
has_ellipsis: predicate
is_assignee_expr: predicate
@ -919,7 +919,7 @@ class RecordPat(Pat):
"""
path: optional[Path] | child
args: list[RecordPatField] | child
flds: list[RecordPatField] | child
has_ellipsis: predicate