Rust: add UseTree::is_star

This commit is contained in:
Arthur Baars
2025-01-28 14:52:29 +01:00
parent f0755bfb5d
commit 8d96c87abe
19 changed files with 148 additions and 75 deletions

View File

@@ -38,6 +38,7 @@ fn property_name(type_name: &str, field_name: &str) -> String {
(_, "else_branch") => "else_",
("ArrayType", "ty") => "element_type_repr",
("SelfParam", "is_amp") => "is_ref",
("UseTree", "is_star") => "is_glob",
(_, "ty") => "type_repr",
_ => field_name,
};
@@ -363,6 +364,12 @@ fn get_fields(node: &AstNodeSrc) -> Vec<FieldInfo> {
ty: FieldType::Predicate,
});
}
"UseTree" => {
result.push(FieldInfo {
name: "is_star".to_string(),
ty: FieldType::Predicate,
});
}
_ => {}
}

View File

@@ -1,2 +1,2 @@
mod.rs 4bcb9def847469aae9d8649461546b7c21ec97cf6e63d3cf394e339915ce65d7 4bcb9def847469aae9d8649461546b7c21ec97cf6e63d3cf394e339915ce65d7
top.rs 97b9c3c5485196cc7949ec1b67c5844b7ff7af67bc2339276adbdafb03789ac0 97b9c3c5485196cc7949ec1b67c5844b7ff7af67bc2339276adbdafb03789ac0
top.rs 952b0987d831566762f61f9303ef573438ec0b17c01874b2e46c5cacc26d81d5 952b0987d831566762f61f9303ef573438ec0b17c01874b2e46c5cacc26d81d5

View File

@@ -3074,6 +3074,7 @@ impl From<trap::Label<UseBoundGenericArgs>> for trap::Label<Locatable> {
#[derive(Debug)]
pub struct UseTree {
pub id: trap::TrapId<UseTree>,
pub is_glob: bool,
pub path: Option<trap::Label<Path>>,
pub rename: Option<trap::Label<Rename>>,
pub use_tree_list: Option<trap::Label<UseTreeList>>,
@@ -3086,6 +3087,9 @@ impl trap::TrapEntry for UseTree {
fn emit(self, id: trap::Label<Self>, out: &mut trap::Writer) {
out.add_tuple("use_trees", vec![id.into()]);
if self.is_glob {
out.add_tuple("use_tree_is_glob", vec![id.into()]);
}
if let Some(v) = self.path {
out.add_tuple("use_tree_paths", vec![id.into(), v.into()]);
}

View File

@@ -2483,11 +2483,13 @@ impl Translator<'_> {
}
pub(crate) fn emit_use_tree(&mut self, node: ast::UseTree) -> Option<Label<generated::UseTree>> {
let is_glob = node.star_token().is_some();
let path = node.path().and_then(|x| self.emit_path(x));
let rename = node.rename().and_then(|x| self.emit_rename(x));
let use_tree_list = node.use_tree_list().and_then(|x| self.emit_use_tree_list(x));
let label = self.trap.emit(generated::UseTree {
id: TrapId::Star,
is_glob,
path,
rename,
use_tree_list,

View File

@@ -177,7 +177,7 @@ lib/codeql/rust/elements/Union.qll 92ffb1abc03889b9b71dae9491d4595e443c80b472474
lib/codeql/rust/elements/Use.qll e27d30ece0456a73732dfd867dfc5abdf48a50de56e7dafcab444b688610af72 7efe59c04dd2f10b4a25b8a17beb51362be0a93d73e5a9e1251cf133cf1227c3
lib/codeql/rust/elements/UseBoundGenericArg.qll f16903f8fff676d3700eaad5490804624391141472ecc3166ccb1f70c794c120 5efda98088d096b42f53ceccae78c05f15c6953525b514d849681cb2cf65b147
lib/codeql/rust/elements/UseBoundGenericArgs.qll 6d3b8bf8e59ef6d10d2f58c6d2eca61b113a524174f62d1f56b724c4179fda04 8fad6ed9e5bf159a2db01e7eb960cc55b940f7b92c4bb5c967120068e4fec80a
lib/codeql/rust/elements/UseTree.qll 16b6e42146dc4c2e9d8cc6bc143933d675d1a4c9a56b309f390f4bf5df99b25d 9f8dd7d621dd15f6f1ccec676b08da02773673cbb3a3570781c16167c6e08ef4
lib/codeql/rust/elements/UseTree.qll 69d96e5985ecdedc421d3d5da16b738ccdbb28ea01ca4d510b98f2a3409b28e5 0188c2744e89e19aa077c802e89faa87d62ca306adb71be8c3b23617f69a5982
lib/codeql/rust/elements/UseTreeList.qll 768c4ec25e8807bba65619f566b22fa5c0946c36e96c88cfdee04c2875b44554 6433c8d9acd4e346cadd5fef01d79dd35bb6245115bdceb5322c0511106030b0
lib/codeql/rust/elements/Variant.qll 328323ef59faf01dcf71e7d728fd10a60465a1bd24e1d3578289cdf6554e5b63 ba49c635790395d9df4398c3c0fec700c3c7761fcc6581623a45d381d23ac34d
lib/codeql/rust/elements/VariantList.qll 07adfe5750b2d5b50c8629f36feba24edd84f75698a80339d4cee20f4e95829d 7d322e60c84ea45f8c8b509226da7ae3c0125bcda42a98a94e3e6a9855cab79e
@@ -443,7 +443,7 @@ lib/codeql/rust/elements/internal/UseBoundGenericArgsImpl.qll 43caeeb43b4b9480bd
lib/codeql/rust/elements/internal/UseConstructor.qll a4f790795e18abc29a50d6fbaa0db64cba781e3259a42cbf0468c24ac66b63e7 2fa288f073ac094a838c11f091def2c790b347b6a1b79407c11b10c73d6bff57
lib/codeql/rust/elements/internal/UseImpl.qll ba779517c3c928ab6e794360b6344829e84ec6da5e1de1b03b4eaf8bdae58ce9 0f4ead9eecb584eb9827502276ffe8cb1da0d2fa4b8f660d2afc26ac4e0fba86
lib/codeql/rust/elements/internal/UseTreeConstructor.qll 3e6e834100fcc7249f8a20f8bd9debe09b705fcf5a0e655537e71ac1c6f7956b cdbc84b8f1b009be1e4a7aaba7f5237823cea62c86b38f1794aad97e3dfcf64b
lib/codeql/rust/elements/internal/UseTreeImpl.qll 25e286538c048cc7ee07f4b5a8b77bc8b5a215fb206f4ab20163bd81dec0b90f fe44969d441c0c34bea1b0c25cdf35f25ea667c6e2da9ea067d230f484492715
lib/codeql/rust/elements/internal/UseTreeImpl.qll d478495a62e466fa4f443ffcf0d5235a7278fa9e8565267e73bb78210b7d54a1 76b71392b12f1bd7e66dd9e2902f48a1c27dce01fadad3a23e5a680d64fa0d49
lib/codeql/rust/elements/internal/UseTreeListConstructor.qll 973577da5d7b58eb245f108bd1ae2fecc5645f2795421dedf7687b067a233003 f41e5e3ffcb2a387e5c37f56c0b271e8dc20428b6ff4c63e1ee42fcfa4e67d0a
lib/codeql/rust/elements/internal/UseTreeListImpl.qll 6cac5242f1219df0fe9b3c139db8cc075a2fde618614ca56de2c856130a8ebaa d2ec917055a45f4d07d4ea6dff14298925ae323b165a5bcb6e906f7aad463f82
lib/codeql/rust/elements/internal/VariantConstructor.qll 0297d4a9a9b32448d6d6063d308c8d0e7a067d028b9ec97de10a1d659ee2cfdd 6a4bee28b340e97d06b262120fd39ab21717233a5bcc142ba542cb1b456eb952
@@ -579,7 +579,7 @@ lib/codeql/rust/elements/internal/generated/ParamList.qll c808c9d84dd7800573832b
lib/codeql/rust/elements/internal/generated/ParenExpr.qll bc0731505bfe88516205ec360582a4222d2681d11342c93e15258590ddee82f2 d4bd6e0c80cf1d63746c88d4bcb3a01d4c75732e5da09e3ebd9437ced227fb60
lib/codeql/rust/elements/internal/generated/ParenPat.qll 4f168ef5d5bb87a903251cc31b2e44a759b099ec69c90af31783fbb15778c940 0e34f94a45a13396fd57d94c245dc64d1adde2ab0e22b56946f7e94c04e297fc
lib/codeql/rust/elements/internal/generated/ParenTypeRepr.qll 40ab5c592e7699c621787793743e33988de71ff42ca27599f5ab3ddb70e3f7d8 12c0a6eed2202ee3e892f61da3b3ce77ac3190854cdf3097e8d2be98aa3cb91d
lib/codeql/rust/elements/internal/generated/ParentChild.qll 738612c1ec404fe8c090e0d234bdac4ce207bd0d4cad699a2981e6b6cb8947a9 df002e5540bfe5de4e6849879f334b09c2ffb4893ff8364146c6c505f4b2d090
lib/codeql/rust/elements/internal/generated/ParentChild.qll a180b0d0c8c33503dc4c013c3f568eaa628d24204bfc36a7484c56a701a79f95 df002e5540bfe5de4e6849879f334b09c2ffb4893ff8364146c6c505f4b2d090
lib/codeql/rust/elements/internal/generated/ParenthesizedArgList.qll c5fa328ea60d3a3333d7c7bb3480969c1873166c7ac8ebb9d0afad7a8099d1a8 2dbbb6200d96f7db7dea4a55bdeab8d67b14d39a43e0bd54ada019f7e466f163
lib/codeql/rust/elements/internal/generated/Pat.qll 3605ac062be2f294ee73336e9669027b8b655f4ad55660e1eab35266275154ee 7f9400db2884d336dd1d21df2a8093759c2a110be9bf6482ce8e80ae0fd74ed4
lib/codeql/rust/elements/internal/generated/Path.qll bf6a86e7fcb7164624cc070dcce86d2bda50a2516b95115b87d0ebb5596e50a1 fd7a9ad4034cdebe8dfe495619c46f464630d38195313072e0bd904061b0fb00
@@ -594,7 +594,7 @@ lib/codeql/rust/elements/internal/generated/PtrTypeRepr.qll 51d1e9e683fc79dddbff
lib/codeql/rust/elements/internal/generated/PureSynthConstructors.qll e5b8e69519012bbaae29dcb82d53f7f7ecce368c0358ec27ef6180b228a0057f e5b8e69519012bbaae29dcb82d53f7f7ecce368c0358ec27ef6180b228a0057f
lib/codeql/rust/elements/internal/generated/RangeExpr.qll 23cca03bf43535f33b22a38894f70d669787be4e4f5b8fe5c8f7b964d30e9027 18624cef6c6b679eeace2a98737e472432e0ead354cca02192b4d45330f047c9
lib/codeql/rust/elements/internal/generated/RangePat.qll 80826a6a6868a803aa2372e31c52a03e1811a3f1f2abdb469f91ca0bfdd9ecb6 34ee1e208c1690cba505dff2c588837c0cd91e185e2a87d1fe673191962276a9
lib/codeql/rust/elements/internal/generated/Raw.qll c75c7811d041897c2d6aae1e0e55b46af6182565e1d0dd624062c5ca499e9325 79e6ded808f14dd622076b75d8e4985c7b90f2d5e964d0750519b510463b47ba
lib/codeql/rust/elements/internal/generated/Raw.qll 5f812a8c841d33127bccca5d3939ad63d0a084cc4df22f43eb84df04f874b2e1 917369eb790c67405d4c32737204bcf919c5c52c5581a48f79b0d35909bb1160
lib/codeql/rust/elements/internal/generated/RecordExpr.qll 2131b2cb336caa76170082e69776011bf02576bbfdd34ba68ca84af24209250a 39a2e3ec32352b594c43cc1295e0e8b3f9808173322d3d73cb7d48ef969d5565
lib/codeql/rust/elements/internal/generated/RecordExprField.qll 7e9f8663d3b74ebbc9603b10c9912f082febba6bd73d344b100bbd3edf837802 fbe6b578e7fd5d5a6f21bbb8c388957ab7210a6a249ec71510a50fb35b319ea1
lib/codeql/rust/elements/internal/generated/RecordExprFieldList.qll 179a97211fe7aa6265085d4d54115cdbc0e1cd7c9b2135591e8f36d6432f13d3 dd44bbbc1e83a1ed3a587afb729d7debf7aeb7b63245de181726af13090e50c0
@@ -646,7 +646,7 @@ lib/codeql/rust/elements/internal/generated/Union.qll 06a602aa7c7097e72fff6ea33d
lib/codeql/rust/elements/internal/generated/Use.qll d42ccf3516a9f79ae8766f93ad5f09d3cdcd7b96844d4c9de64189b56018a7b4 70a9553a8f71f6cbfdd0f59a4b42292d13177613ceb0542436436e0ac2e1f8ee
lib/codeql/rust/elements/internal/generated/UseBoundGenericArg.qll 69162794e871291545ea04f61259b2d000671a96f7ca129f7dd9ed6e984067c4 31de9ebc0634b38e2347e0608b4ea888892f1f2732a2892464078cd8a07b4ee8
lib/codeql/rust/elements/internal/generated/UseBoundGenericArgs.qll 05dca015d922935887856f3a0d577dbcf5b8f82bc384bdc9c8c2d0106419716d fcee14ed4f7a639b1ba721bd390fc0cdbfdc7c759e3092aa462d466fe390de45
lib/codeql/rust/elements/internal/generated/UseTree.qll b39cbc96e473802372726d580febbfa7d73668ba476095aa4a61fae914865913 40ce6515b7df068fa8c0a7e5ae8984f50b71f6f96d625d631b28d525e3e868b7
lib/codeql/rust/elements/internal/generated/UseTree.qll 15b84e3a194959aef793cd0c16b3d2d21ee5822e2d26186b5d73f922325c2827 49c409a7b82c1099436fbe3bd041d35dcd23169d58d31fbd718f6deb96fb7318
lib/codeql/rust/elements/internal/generated/UseTreeList.qll 829441cf309f008a6a9d2e784aa414ab4c11880a658f8ee71aa4df385cd2b6a8 ced82df94fea7a191f414f7e6496d13791d2f535046844b6f712a390663ac3d0
lib/codeql/rust/elements/internal/generated/Variant.qll e40dbb23e07c5b70adc577efdf7a064e773207f216cad8fe8905882b1da9f4a9 13f7be36d043afcfc156d2c01bb828de882df69aa732f284aa76c5f00b063544
lib/codeql/rust/elements/internal/generated/VariantList.qll 4eb923ca341033c256ca9b8a8a5b4e14c7eac9d015be187fd97eeb25dfb1e18e e7865e975c35db49cd72cb8f9864797d3cfed16c3a675b5032b867ced2bbb405
@@ -1189,7 +1189,7 @@ test/extractor-tests/generated/Use/Use_getExtendedCanonicalPath.ql ccfde95c861cf
test/extractor-tests/generated/Use/Use_getUseTree.ql 1dfe6bb40b29fbf823d67fecfc36ba928b43f17c38227b8eedf19fa252edf3af aacdcc4cf418ef1eec267287d2af905fe73f5bcfb080ef5373d08da31c608720
test/extractor-tests/generated/Use/Use_getVisibility.ql 587f80acdd780042c48aeb347004be5e9fd9df063d263e6e4f2b660c48c53a8f 0c2c04f95838bca93dfe93fa208e1df7677797efc62b4e8052a4f9c5d20831dd
test/extractor-tests/generated/UseBoundGenericArgs/MISSING_SOURCE.txt b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1
test/extractor-tests/generated/UseTree/UseTree.ql cb9f63051ae08cf8557b86b69b02cefe1732fc1e2daec34bcb891e271829cd86 eb46496aab9252b21eb0ccdd75792a97264885259c23d7e17e3013d943783947
test/extractor-tests/generated/UseTree/UseTree.ql e305edd22df9e018a58f932774447354b7fcf0ba871b52b35f0ee9cd4f6dacdf 766a84116aa8ff3d90343c6730bcb161ff1d447bdb049cd21d6b2bbf3cb9032c
test/extractor-tests/generated/UseTree/UseTree_getPath.ql 80384a99674bdda85315a36681cb22ad2ad094005a5543b63d930fc7e030dd5b 2cd92b5de8b4214527f8a58d641430f6804d9bd40927e1da0c7efda2f86f6544
test/extractor-tests/generated/UseTree/UseTree_getRename.ql ec3917501f3c89ac4974fab3f812d00b159ae6f2402dd20e5b4b3f8e8426391d db9ed981ce5f822aee349e5841d3126af7878d90e64140756ab4519552defe72
test/extractor-tests/generated/UseTree/UseTree_getUseTreeList.ql c265a88347e813840969ae934dfd2904bc06f502de77709bc0b1c7255e46382a 52a239c8ea5fd8fbfbd606559d70ecadc769887437a9bcab6fb3e774208ad868

View File

@@ -12,7 +12,10 @@ import codeql.rust.elements.UseTreeList
/**
* A UseTree. For example:
* ```rust
* todo!()
* use std::collections::HashMap;
* use std::collections::*;
* use std::collections::HashMap as MyHashMap;
* use std::collections::{self, HashMap, HashSet};
* ```
*/
final class UseTree = Impl::UseTree;

View File

@@ -15,7 +15,10 @@ module Impl {
/**
* A UseTree. For example:
* ```rust
* todo!()
* use std::collections::HashMap;
* use std::collections::*;
* use std::collections::HashMap as MyHashMap;
* use std::collections::{self, HashMap, HashSet};
* ```
*/
class UseTree extends Generated::UseTree { }

View File

@@ -1090,12 +1090,20 @@ module Raw {
* INTERNAL: Do not use.
* A UseTree. For example:
* ```rust
* todo!()
* use std::collections::HashMap;
* use std::collections::*;
* use std::collections::HashMap as MyHashMap;
* use std::collections::{self, HashMap, HashSet};
* ```
*/
class UseTree extends @use_tree, AstNode {
override string toString() { result = "UseTree" }
/**
* Holds if this use tree is glob.
*/
predicate isGlob() { use_tree_is_glob(this) }
/**
* Gets the path of this use tree, if it exists.
*/

View File

@@ -19,7 +19,10 @@ module Generated {
/**
* A UseTree. For example:
* ```rust
* todo!()
* use std::collections::HashMap;
* use std::collections::*;
* use std::collections::HashMap as MyHashMap;
* use std::collections::{self, HashMap, HashSet};
* ```
* INTERNAL: Do not reference the `Generated::UseTree` class directly.
* Use the subclass `UseTree`, where the following predicates are available.
@@ -27,6 +30,11 @@ module Generated {
class UseTree extends Synth::TUseTree, AstNodeImpl::AstNode {
override string getAPrimaryQlClass() { result = "UseTree" }
/**
* Holds if this use tree is glob.
*/
predicate isGlob() { Synth::convertUseTreeToRaw(this).(Raw::UseTree).isGlob() }
/**
* Gets the path of this use tree, if it exists.
*/

View File

@@ -1094,6 +1094,11 @@ use_trees(
unique int id: @use_tree
);
#keyset[id]
use_tree_is_glob(
int id: @use_tree ref
);
#keyset[id]
use_tree_paths(
int id: @use_tree ref,

View File

@@ -130,7 +130,7 @@ TypeParam/gen_type_param.rs 31c02d18020b305f1c37fdeb97656dd5b1e49e6b9a072329c2f0
UnderscoreExpr/gen_underscore_expr.rs fe34e99d322bf86c0f5509c9b5fd6e1e8abbdf63dbe7e01687344a41e9aabe52 fe34e99d322bf86c0f5509c9b5fd6e1e8abbdf63dbe7e01687344a41e9aabe52
Union/gen_union.rs d5e814688e93dcb105f29a392159c1b995ee15a74720167219f9431db8ef70a3 d5e814688e93dcb105f29a392159c1b995ee15a74720167219f9431db8ef70a3
Use/gen_use.rs 2a0ea9fa34d844fda63e8f605f6a951e8b272d63ebfb0ae501fc734559a83a6b 2a0ea9fa34d844fda63e8f605f6a951e8b272d63ebfb0ae501fc734559a83a6b
UseTree/gen_use_tree.rs 0a310eb8ce7abf481df813464dabac528a8f70d64d541409c66f957dfdd068d0 0a310eb8ce7abf481df813464dabac528a8f70d64d541409c66f957dfdd068d0
UseTree/gen_use_tree.rs bf7525e8641a5a90a7e07214e7480b6507737cf60f9bd4d8b82bc71a8b9d7e8d bf7525e8641a5a90a7e07214e7480b6507737cf60f9bd4d8b82bc71a8b9d7e8d
UseTreeList/gen_use_tree_list.rs ba450699782e51b1d3139148709827e35f2e57235849fb26a073e2786dfc53e3 ba450699782e51b1d3139148709827e35f2e57235849fb26a073e2786dfc53e3
Variant/gen_variant.rs 036566793ee468418f915974e2925d8bafaec3c93c2463212f222e6a5f290f24 036566793ee468418f915974e2925d8bafaec3c93c2463212f222e6a5f290f24
VariantList/gen_variant_list.rs 932b67564c5ef4116d84db6945e098f6d7438755d99fc198fde8f4527979bf00 932b67564c5ef4116d84db6945e098f6d7438755d99fc198fde8f4527979bf00

View File

@@ -0,0 +1,7 @@
| gen_use_tree.rs:5:9:5:33 | UseTree | isGlob: | no | hasPath: | yes | hasRename: | no | hasUseTreeList: | no |
| gen_use_tree.rs:6:9:6:27 | UseTree | isGlob: | yes | hasPath: | yes | hasRename: | no | hasUseTreeList: | no |
| gen_use_tree.rs:7:9:7:46 | UseTree | isGlob: | no | hasPath: | yes | hasRename: | yes | hasUseTreeList: | no |
| gen_use_tree.rs:8:9:8:50 | UseTree | isGlob: | no | hasPath: | yes | hasRename: | no | hasUseTreeList: | yes |
| gen_use_tree.rs:8:28:8:31 | UseTree | isGlob: | no | hasPath: | yes | hasRename: | no | hasUseTreeList: | no |
| gen_use_tree.rs:8:34:8:40 | UseTree | isGlob: | no | hasPath: | yes | hasRename: | no | hasUseTreeList: | no |
| gen_use_tree.rs:8:43:8:49 | UseTree | isGlob: | no | hasPath: | yes | hasRename: | no | hasUseTreeList: | no |

View File

@@ -2,11 +2,13 @@
import codeql.rust.elements
import TestUtils
from UseTree x, string hasPath, string hasRename, string hasUseTreeList
from UseTree x, string isGlob, string hasPath, string hasRename, string hasUseTreeList
where
toBeTested(x) and
not x.isUnknown() and
(if x.isGlob() then isGlob = "yes" else isGlob = "no") and
(if x.hasPath() then hasPath = "yes" else hasPath = "no") and
(if x.hasRename() then hasRename = "yes" else hasRename = "no") and
if x.hasUseTreeList() then hasUseTreeList = "yes" else hasUseTreeList = "no"
select x, "hasPath:", hasPath, "hasRename:", hasRename, "hasUseTreeList:", hasUseTreeList
select x, "isGlob:", isGlob, "hasPath:", hasPath, "hasRename:", hasRename, "hasUseTreeList:",
hasUseTreeList

View File

@@ -0,0 +1,7 @@
| gen_use_tree.rs:5:9:5:33 | UseTree | gen_use_tree.rs:5:9:5:33 | ...::HashMap |
| gen_use_tree.rs:6:9:6:27 | UseTree | gen_use_tree.rs:6:9:6:24 | ...::collections |
| gen_use_tree.rs:7:9:7:46 | UseTree | gen_use_tree.rs:7:9:7:33 | ...::HashMap |
| gen_use_tree.rs:8:9:8:50 | UseTree | gen_use_tree.rs:8:9:8:24 | ...::collections |
| gen_use_tree.rs:8:28:8:31 | UseTree | gen_use_tree.rs:8:28:8:31 | self |
| gen_use_tree.rs:8:34:8:40 | UseTree | gen_use_tree.rs:8:34:8:40 | HashMap |
| gen_use_tree.rs:8:43:8:49 | UseTree | gen_use_tree.rs:8:43:8:49 | HashSet |

View File

@@ -0,0 +1 @@
| gen_use_tree.rs:7:9:7:46 | UseTree | gen_use_tree.rs:7:35:7:46 | Rename |

View File

@@ -0,0 +1 @@
| gen_use_tree.rs:8:9:8:50 | UseTree | gen_use_tree.rs:8:27:8:50 | UseTreeList |

View File

@@ -2,5 +2,8 @@
fn test_use_tree() -> () {
// A UseTree. For example:
todo!()
use std::collections::HashMap;
use std::collections::*;
use std::collections::HashMap as MyHashMap;
use std::collections::{self, HashMap, HashSet};
}

View File

@@ -1,12 +1,14 @@
from misc.codegen.lib.schemadefs import *
from .ast import *
class LabelableExpr(Expr):
"""
The base class for expressions that can be labeled (`LoopExpr`, `ForExpr`, `WhileExpr` or `BlockExpr`).
"""
label: optional[Label] | child
class LoopingExpr(LabelableExpr):
"""
The base class for expressions that loop (`LoopExpr`, `ForExpr` or `WhileExpr`).
@@ -14,7 +16,6 @@ class LoopingExpr(LabelableExpr):
loop_body: optional["BlockExpr"] | child
@annotate(Module)
@rust.doc_test_signature(None)
class _:
@@ -31,14 +32,14 @@ class _:
"""
@annotate(Expr, cfg = True)
@annotate(Expr, cfg=True)
class _:
"""
The base class for expressions.
"""
@annotate(Pat, cfg = True)
@annotate(Pat, cfg=True)
class _:
"""
The base class for patterns.
@@ -76,6 +77,7 @@ class _:
```
"""
@annotate(Path)
class _:
"""
@@ -120,7 +122,7 @@ class PathExprBase(Expr):
"""
@annotate(PathExpr, replace_bases={Expr: PathExprBase}, add_bases=(PathAstNode,), cfg = True)
@annotate(PathExpr, replace_bases={Expr: PathExprBase}, add_bases=(PathAstNode,), cfg=True)
@qltest.test_with(Path)
class _:
"""
@@ -135,7 +137,7 @@ class _:
path: drop
@annotate(IfExpr, cfg = True)
@annotate(IfExpr, cfg=True)
class _:
"""
An `if` expression. For example:
@@ -154,7 +156,7 @@ class _:
"""
@annotate(LetExpr, cfg = True)
@annotate(LetExpr, cfg=True)
@rust.doc_test_signature("(maybe_some: Option<String>) -> ()")
class _:
"""
@@ -167,7 +169,7 @@ class _:
"""
@annotate(BlockExpr, replace_bases={Expr: LabelableExpr}, cfg = True)
@annotate(BlockExpr, replace_bases={Expr: LabelableExpr}, cfg=True)
class _:
"""
A block expression. For example:
@@ -186,7 +188,7 @@ class _:
label: drop
@annotate(LoopExpr, replace_bases={Expr: LoopingExpr}, cfg = True)
@annotate(LoopExpr, replace_bases={Expr: LoopingExpr}, cfg=True)
class _:
"""
A loop expression. For example:
@@ -224,7 +226,7 @@ class CallExprBase(Expr):
attrs: list["Attr"] | child
@annotate(CallExpr, replace_bases={Expr: CallExprBase}, cfg = True)
@annotate(CallExpr, replace_bases={Expr: CallExprBase}, cfg=True)
class _:
"""
A function call expression. For example:
@@ -239,7 +241,7 @@ class _:
attrs: drop
@annotate(MethodCallExpr, replace_bases={Expr: CallExprBase}, add_bases=(Resolvable,), cfg = True)
@annotate(MethodCallExpr, replace_bases={Expr: CallExprBase}, add_bases=(Resolvable,), cfg=True)
class _:
"""
A method call expression. For example:
@@ -272,7 +274,7 @@ class _:
"""
@annotate(MatchExpr, cfg = True)
@annotate(MatchExpr, cfg=True)
@rust.doc_test_signature("(x: i32) -> i32")
class _:
"""
@@ -290,10 +292,11 @@ class _:
}
```
"""
scrutinee: _ | doc("scrutinee (the expression being matched) of this match expression")
scrutinee: _ | doc(
"scrutinee (the expression being matched) of this match expression")
@annotate(ContinueExpr, cfg = True)
@annotate(ContinueExpr, cfg=True)
class _:
"""
A continue expression. For example:
@@ -314,7 +317,7 @@ class _:
"""
@annotate(BreakExpr, cfg = True)
@annotate(BreakExpr, cfg=True)
class _:
"""
A break expression. For example:
@@ -343,7 +346,7 @@ class _:
"""
@annotate(ReturnExpr, cfg = True)
@annotate(ReturnExpr, cfg=True)
@rust.doc_test_signature(None)
class _:
"""
@@ -361,7 +364,7 @@ class _:
"""
@annotate(BecomeExpr, cfg = True)
@annotate(BecomeExpr, cfg=True)
@rust.doc_test_signature(None)
class _:
"""
@@ -378,7 +381,7 @@ class _:
"""
@annotate(YieldExpr, cfg = True)
@annotate(YieldExpr, cfg=True)
class _:
"""
A `yield` expression. For example:
@@ -391,7 +394,7 @@ class _:
"""
@annotate(YeetExpr, cfg = True)
@annotate(YeetExpr, cfg=True)
class _:
"""
A `yeet` expression. For example:
@@ -413,7 +416,7 @@ class _:
"""
@annotate(RecordExpr, add_bases=(PathAstNode,), cfg = True)
@annotate(RecordExpr, add_bases=(PathAstNode,), cfg=True)
class _:
"""
A record expression. For example:
@@ -427,7 +430,7 @@ class _:
path: drop
@annotate(FieldExpr, cfg = True)
@annotate(FieldExpr, cfg=True)
class _:
"""
A field access expression. For example:
@@ -437,7 +440,7 @@ class _:
"""
@annotate(AwaitExpr, cfg = True)
@annotate(AwaitExpr, cfg=True)
class _:
"""
An `await` expression. For example:
@@ -450,7 +453,7 @@ class _:
"""
@annotate(CastExpr, cfg = True)
@annotate(CastExpr, cfg=True)
class _:
"""
A type cast expression. For example:
@@ -460,7 +463,7 @@ class _:
"""
@annotate(RefExpr, cfg = True)
@annotate(RefExpr, cfg=True)
class _:
"""
A reference expression. For example:
@@ -473,7 +476,7 @@ class _:
"""
@annotate(PrefixExpr, cfg = True)
@annotate(PrefixExpr, cfg=True)
class _:
"""
A unary operation expression. For example:
@@ -485,7 +488,7 @@ class _:
"""
@annotate(BinaryExpr, cfg = True)
@annotate(BinaryExpr, cfg=True)
class _:
"""
A binary operation expression. For example:
@@ -499,7 +502,7 @@ class _:
"""
@annotate(RangeExpr, cfg = True)
@annotate(RangeExpr, cfg=True)
class _:
"""
A range expression. For example:
@@ -514,7 +517,7 @@ class _:
"""
@annotate(IndexExpr, cfg = True)
@annotate(IndexExpr, cfg=True)
class _:
"""
An index expression. For example:
@@ -541,7 +544,7 @@ class _:
"""
@annotate(TupleExpr, cfg = True)
@annotate(TupleExpr, cfg=True)
class _:
"""
A tuple expression. For example:
@@ -558,6 +561,7 @@ class _:
class _:
pass
class ArrayExpr(Expr):
"""
The base class for array expressions. For example:
@@ -569,6 +573,7 @@ class ArrayExpr(Expr):
exprs: list[Expr] | child
attrs: list[Attr] | child
@synth.from_class(ArrayExprInternal)
class ArrayListExpr(ArrayExpr):
"""
@@ -579,6 +584,7 @@ class ArrayListExpr(ArrayExpr):
"""
__cfg__ = True
@synth.from_class(ArrayExprInternal)
class ArrayRepeatExpr(ArrayExpr):
"""
@@ -593,7 +599,7 @@ class ArrayRepeatExpr(ArrayExpr):
repeat_length: Expr | child
@annotate(LiteralExpr, cfg = True)
@annotate(LiteralExpr, cfg=True)
class _:
"""
A literal expression. For example:
@@ -610,7 +616,7 @@ class _:
"""
@annotate(UnderscoreExpr, cfg = True)
@annotate(UnderscoreExpr, cfg=True)
class _:
"""
An underscore expression. For example:
@@ -620,7 +626,7 @@ class _:
"""
@annotate(OffsetOfExpr, cfg = True)
@annotate(OffsetOfExpr, cfg=True)
class _:
"""
An `offset_of` expression. For example:
@@ -630,7 +636,7 @@ class _:
"""
@annotate(AsmExpr, cfg = True)
@annotate(AsmExpr, cfg=True)
class _:
"""
An inline assembly expression. For example:
@@ -642,7 +648,7 @@ class _:
"""
@annotate(LetStmt, cfg = True)
@annotate(LetStmt, cfg=True)
class _:
"""
A let statement. For example:
@@ -671,7 +677,7 @@ class _:
"""
@annotate(WildcardPat, cfg = True)
@annotate(WildcardPat, cfg=True)
class _:
"""
A wildcard pattern. For example:
@@ -681,7 +687,7 @@ class _:
"""
@annotate(TuplePat, cfg = True)
@annotate(TuplePat, cfg=True)
class _:
"""
A tuple pattern. For example:
@@ -692,7 +698,7 @@ class _:
"""
@annotate(OrPat, cfg = True)
@annotate(OrPat, cfg=True)
class _:
"""
An or pattern. For example:
@@ -714,7 +720,7 @@ class _:
"""
@annotate(RecordPat, add_bases=(PathAstNode,), cfg = True)
@annotate(RecordPat, add_bases=(PathAstNode,), cfg=True)
class _:
"""
A record pattern. For example:
@@ -728,7 +734,7 @@ class _:
path: drop
@annotate(RangePat, cfg = True)
@annotate(RangePat, cfg=True)
class _:
"""
A range pattern. For example:
@@ -742,7 +748,7 @@ class _:
"""
@annotate(SlicePat, cfg = True)
@annotate(SlicePat, cfg=True)
class _:
"""
A slice pattern. For example:
@@ -756,7 +762,7 @@ class _:
"""
@annotate(PathPat, add_bases=(PathAstNode,), cfg = True)
@annotate(PathPat, add_bases=(PathAstNode,), cfg=True)
@qltest.test_with(Path)
class _:
"""
@@ -771,7 +777,7 @@ class _:
path: drop
@annotate(LiteralPat, cfg = True)
@annotate(LiteralPat, cfg=True)
class _:
"""
A literal pattern. For example:
@@ -784,7 +790,7 @@ class _:
"""
@annotate(IdentPat, cfg = True)
@annotate(IdentPat, cfg=True)
class _:
"""
A binding pattern. For example:
@@ -803,7 +809,7 @@ class _:
"""
@annotate(TupleStructPat, add_bases=(PathAstNode,), cfg = True)
@annotate(TupleStructPat, add_bases=(PathAstNode,), cfg=True)
class _:
"""
A tuple struct pattern. For example:
@@ -818,7 +824,7 @@ class _:
path: drop
@annotate(RefPat, cfg = True)
@annotate(RefPat, cfg=True)
class _:
"""
A reference pattern. For example:
@@ -831,7 +837,7 @@ class _:
"""
@annotate(BoxPat, cfg = True)
@annotate(BoxPat, cfg=True)
class _:
"""
A box pattern. For example:
@@ -844,7 +850,7 @@ class _:
"""
@annotate(ConstBlockPat, cfg = True)
@annotate(ConstBlockPat, cfg=True)
class _:
"""
A const block pattern. For example:
@@ -1045,7 +1051,7 @@ class _:
"""
@annotate(ForExpr, replace_bases={Expr: LoopingExpr}, cfg = True)
@annotate(ForExpr, replace_bases={Expr: LoopingExpr}, cfg=True)
class _:
"""
A ForExpr. For example:
@@ -1067,7 +1073,7 @@ class _:
"""
@annotate(FormatArgsArg, cfg = True)
@annotate(FormatArgsArg, cfg=True)
@qltest.test_with(FormatArgsExpr)
class _:
"""
@@ -1078,7 +1084,7 @@ class _:
"""
@annotate(FormatArgsExpr, cfg = True)
@annotate(FormatArgsExpr, cfg=True)
class _:
"""
A FormatArgsExpr. For example:
@@ -1213,7 +1219,7 @@ class _:
"""
@annotate(MacroCall, cfg = True)
@annotate(MacroCall, cfg=True)
class _:
"""
A MacroCall. For example:
@@ -1234,7 +1240,7 @@ class _:
"""
@annotate(MacroExpr, cfg = True)
@annotate(MacroExpr, cfg=True)
class _:
"""
A MacroExpr. For example:
@@ -1257,7 +1263,7 @@ class _:
"""
@annotate(MacroPat, cfg = True)
@annotate(MacroPat, cfg=True)
class _:
"""
A MacroPat. For example:
@@ -1367,11 +1373,13 @@ class ParamBase(AstNode):
attrs: list["Attr"] | child
type_repr: optional["TypeRepr"] | child
@annotate(ParamBase, cfg = True)
@annotate(ParamBase, cfg=True)
class _:
pass
@annotate(Param, replace_bases={AstNode: ParamBase}, cfg = True)
@annotate(Param, replace_bases={AstNode: ParamBase}, cfg=True)
class _:
"""
A parameter in a function or method. For example `x` in:
@@ -1515,7 +1523,7 @@ class _:
"""
@annotate(RestPat, cfg = True)
@annotate(RestPat, cfg=True)
class _:
"""
A RestPat. For example:
@@ -1545,7 +1553,7 @@ class _:
"""
@annotate(SelfParam, replace_bases={AstNode: ParamBase}, cfg = True)
@annotate(SelfParam, replace_bases={AstNode: ParamBase}, cfg=True)
@rust.doc_test_signature(None)
class _:
"""
@@ -1652,7 +1660,7 @@ class _:
"""
@annotate(TryExpr, cfg = True)
@annotate(TryExpr, cfg=True)
class _:
"""
A TryExpr. For example:
@@ -1767,7 +1775,10 @@ class _:
"""
A UseTree. For example:
```rust
todo!()
use std::collections::HashMap;
use std::collections::*;
use std::collections::HashMap as MyHashMap;
use std::collections::{self, HashMap, HashSet};
```
"""
@@ -1832,7 +1843,7 @@ class _:
"""
@annotate(WhileExpr, replace_bases={Expr: LoopingExpr}, cfg = True)
@annotate(WhileExpr, replace_bases={Expr: LoopingExpr}, cfg=True)
class _:
"""
A WhileExpr. For example:
@@ -1864,7 +1875,6 @@ class FormatTemplateVariableAccess(PathExprBase):
@synth.on_arguments(parent=FormatArgsExpr, index=int, text=string, offset=int)
@qltest.test_with(FormatArgsExpr)
class Format(Locatable):
"""
A format element in a formatting template. For example the `{}` in:
@@ -1920,6 +1930,7 @@ class FormatArgument(Locatable):
parent: Format
variable: optional[FormatTemplateVariableAccess] | child
@annotate(Item, add_bases=(Addressable,))
class _:
pass

1
rust/schema/ast.py generated
View File

@@ -727,6 +727,7 @@ class UseBoundGenericArgs(AstNode, ):
use_bound_generic_args: list["UseBoundGenericArg"] | child
class UseTree(AstNode, ):
is_glob: predicate
path: optional["Path"] | child
rename: optional["Rename"] | child
use_tree_list: optional["UseTreeList"] | child