Rust: introduce typed labels

This commit is contained in:
Paolo Tranquilli
2024-09-13 13:18:33 +02:00
parent 0b850a2dff
commit faf1eeeb0d
18 changed files with 4922 additions and 966 deletions

View File

@@ -20,7 +20,7 @@ def _get_type(t: str) -> str:
case "int":
return "usize"
case _ if t[0].isupper():
return "trap::Label"
return f"{t}TrapLabel"
case "boolean":
assert False, "boolean unsupported"
case _:
@@ -57,6 +57,15 @@ def _get_properties(
yield cls, p
def _get_ancestors(
cls: schema.Class, lookup: dict[str, schema.Class]
) -> typing.Iterable[schema.Class]:
for b in cls.bases:
base = lookup[b]
yield base
yield from _get_ancestors(base, lookup)
class Processor:
def __init__(self, data: schema.Schema):
self._classmap = data.classes
@@ -69,14 +78,15 @@ class Processor:
_get_field(c, p)
for c, p in _get_properties(cls, self._classmap)
if "rust_skip" not in p.pragmas and not p.synth
],
] if not cls.derived else [],
ancestors=sorted(set(a.name for a in _get_ancestors(cls, self._classmap))),
table_name=inflection.tableize(cls.name),
)
def get_classes(self):
ret = {"": []}
for k, cls in self._classmap.items():
if not cls.synth and not cls.derived:
if not cls.synth:
ret.setdefault(cls.group, []).append(self._get_class(cls.name))
return ret

View File

@@ -110,8 +110,9 @@ class Field:
@dataclasses.dataclass
class Class:
name: str
table_name: str
table_name: str | None = None
fields: list[Field] = dataclasses.field(default_factory=list)
ancestors: list[str] = dataclasses.field(default_factory=list)
@property
def single_field_entries(self):

View File

@@ -2,48 +2,77 @@
#![cfg_attr(any(), rustfmt::skip)]
use crate::trap::{TrapId, TrapEntry};
use codeql_extractor::trap;
use crate::trap;
{{#classes}}
#[derive(Debug, Clone, Copy, Eq, PartialEq, Ord, PartialOrd, Hash)]
pub struct {{name}}TrapLabel(trap::UntypedLabel);
impl From<trap::UntypedLabel> for {{name}}TrapLabel {
fn from(value: trap::UntypedLabel) -> Self {
Self(value)
}
}
impl From<{{name}}TrapLabel> for trap::TrapId<{{name}}> {
fn from(value: {{name}}TrapLabel) -> Self {
Self::Label(value)
}
}
impl trap::Label for {{name}}TrapLabel {
fn as_untyped(&self) -> trap::UntypedLabel {
self.0
}
}
impl From<{{name}}TrapLabel> for trap::Arg {
fn from(value: {{name}}TrapLabel) -> Self {
value.0.into()
}
}
{{#table_name}}
#[derive(Debug)]
pub struct {{name}} {
pub id: TrapId,
pub id: trap::TrapId<{{name}}>,
{{#fields}}
pub {{field_name}}: {{type}},
{{/fields}}
}
impl TrapEntry for {{name}} {
fn extract_id(&mut self) -> TrapId {
std::mem::replace(&mut self.id, TrapId::Star)
impl trap::TrapEntry for {{name}} {
fn class_name() -> &'static str { "{{name}}" }
fn extract_id(&mut self) -> trap::TrapId<Self> {
std::mem::replace(&mut self.id, trap::TrapId::Star)
}
fn emit(self, id: trap::Label, out: &mut trap::Writer) {
fn emit(self, id: Self::Label, out: &mut trap::Writer) {
{{#single_field_entries}}
out.add_tuple("{{table_name}}", vec![trap::Arg::Label(id){{#fields}}, self.{{field_name}}.into(){{/fields}}]);
out.add_tuple("{{table_name}}", vec![id.into(){{#fields}}, self.{{field_name}}.into(){{/fields}}]);
{{/single_field_entries}}
{{#fields}}
{{#is_predicate}}
if self.{{field_name}} {
out.add_tuple("{{table_name}}", vec![trap::Arg::Label(id)]);
out.add_tuple("{{table_name}}", vec![id.into()]);
}
{{/is_predicate}}
{{#is_optional}}
{{^is_repeated}}
if let Some(v) = self.{{field_name}} {
out.add_tuple("{{table_name}}", vec![trap::Arg::Label(id), v.into()]);
out.add_tuple("{{table_name}}", vec![id.into(), v.into()]);
}
{{/is_repeated}}
{{/is_optional}}
{{#is_repeated}}
for (i, v) in self.{{field_name}}.into_iter().enumerate() {
{{^is_optional}}
out.add_tuple("{{table_name}}", vec![trap::Arg::Label(id){{^is_unordered}}, i.into(){{/is_unordered}}, v.into()]);
out.add_tuple("{{table_name}}", vec![id.into(){{^is_unordered}}, i.into(){{/is_unordered}}, v.into()]);
{{/is_optional}}
{{#is_optional}}
if let Some(v) = v {
out.add_tuple("{{table_name}}", vec![trap::Arg::Label(id){{^is_unordered}}, i.into(){{/is_unordered}}, v.into()]);
out.add_tuple("{{table_name}}", vec![id.into(){{^is_unordered}}, i.into(){{/is_unordered}}, v.into()]);
}
{{/is_optional}}
}
@@ -51,4 +80,26 @@ impl TrapEntry for {{name}} {
{{/fields}}
}
}
{{/table_name}}
{{^table_name}}
{{! virtual class, make it unbuildable }}
pub struct {{name}} {
unused: ()
}
{{/table_name}}
impl trap::TrapClass for {{name}} {
type Label = {{name}}TrapLabel;
}
{{/classes}}
// Conversions
{{#classes}}
{{#ancestors}}
impl From<{{name}}TrapLabel> for {{.}}TrapLabel {
fn from(value: {{name}}TrapLabel) -> Self {
value.0.into()
}
}
{{/ancestors}}
{{/classes}}

View File

@@ -1,2 +1,2 @@
mod.rs 7cdfedcd68cf8e41134daf810c1af78624082b0c3e8be6570339b1a69a5d457e 7cdfedcd68cf8e41134daf810c1af78624082b0c3e8be6570339b1a69a5d457e
top.rs 7150acaeab0b57039ca9f2ed20311229aab5fd48b533f13410ecc34fd8e3bda0 7150acaeab0b57039ca9f2ed20311229aab5fd48b533f13410ecc34fd8e3bda0
top.rs e06dc90de4abd57719786fd5e49e6ea3089ec3ec167c64446e25d95a16b1714c e06dc90de4abd57719786fd5e49e6ea3089ec3ec167c64446e25d95a16b1714c

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -5,14 +5,18 @@ use log::debug;
use ra_ap_ide_db::line_index::LineCol;
use std::ffi::OsString;
use std::fmt::Debug;
use std::hash::Hash;
use std::path::{Path, PathBuf};
pub use trap::Label as UntypedLabel;
pub use trap::{Arg, Writer};
//TODO: typed labels
pub trait AsTrapKeyPart {
fn as_key_part(&self) -> String;
}
impl AsTrapKeyPart for trap::Label {
impl AsTrapKeyPart for UntypedLabel {
fn as_key_part(&self) -> String {
format!("{{{}}}", self)
}
@@ -31,27 +35,27 @@ impl AsTrapKeyPart for &str {
}
#[derive(Debug, Clone)]
pub enum TrapId {
pub enum TrapId<T: TrapEntry> {
Star,
Key(String),
Label(trap::Label),
Label(T::Label),
}
impl From<String> for TrapId {
impl<T: TrapEntry> From<String> for TrapId<T> {
fn from(value: String) -> Self {
TrapId::Key(value)
}
}
impl From<&str> for TrapId {
impl<T: TrapEntry> From<&str> for TrapId<T> {
fn from(value: &str) -> Self {
TrapId::Key(value.into())
}
}
impl From<trap::Label> for TrapId {
fn from(value: trap::Label) -> Self {
TrapId::Label(value)
impl<T: TrapEntry> From<UntypedLabel> for TrapId<T> {
fn from(value: UntypedLabel) -> Self {
TrapId::Label(value.into())
}
}
@@ -66,9 +70,23 @@ macro_rules! trap_key {
}};
}
pub trait TrapEntry: std::fmt::Debug {
fn extract_id(&mut self) -> TrapId;
fn emit(self, id: trap::Label, out: &mut trap::Writer);
pub trait Label: From<UntypedLabel> + Clone + Debug + Hash + Into<Arg> {
fn as_untyped(&self) -> UntypedLabel;
fn as_key_part(&self) -> String {
self.as_untyped().as_key_part()
}
}
pub trait TrapClass {
type Label: Label;
}
pub trait TrapEntry: std::fmt::Debug + TrapClass + Sized {
fn class_name() -> &'static str;
fn extract_id(&mut self) -> TrapId<Self>;
fn emit(self, id: Self::Label, out: &mut trap::Writer);
}
pub struct TrapFile {
@@ -78,10 +96,10 @@ pub struct TrapFile {
}
impl TrapFile {
pub fn emit_location(
pub fn emit_location<L: Label>(
&mut self,
file_label: trap::Label,
entity_label: trap::Label,
file_label: UntypedLabel,
entity_label: L,
start: LineCol,
end: LineCol,
) {
@@ -101,10 +119,7 @@ impl TrapFile {
);
self.writer.add_tuple(
"locatable_locations",
vec![
trap::Arg::Label(entity_label),
trap::Arg::Label(location_label),
],
vec![entity_label.into(), location_label.into()],
);
}
@@ -112,17 +127,21 @@ impl TrapFile {
extractor::populate_file(&mut self.writer, absolute_path)
}
pub fn label(&mut self, id: TrapId) -> trap::Label {
pub fn label<T: TrapEntry>(&mut self, id: TrapId<T>) -> T::Label {
match id {
TrapId::Star => self.writer.fresh_id(),
TrapId::Key(s) => self.writer.global_id(&s).0,
TrapId::Star => self.writer.fresh_id().into(),
TrapId::Key(s) => self
.writer
.global_id(&format!("{},{}", T::class_name(), s))
.0
.into(),
TrapId::Label(l) => l,
}
}
pub fn emit<T: TrapEntry>(&mut self, mut e: T) -> trap::Label {
pub fn emit<T: TrapEntry>(&mut self, mut e: T) -> T::Label {
let label = self.label(e.extract_id());
e.emit(label, &mut self.writer);
e.emit(label.clone(), &mut self.writer);
label
}

View File

@@ -111,7 +111,6 @@ lib/codeql/rust/elements/TuplePatConstructor.qll 505c4f440b47da576acd7e3fc69d6b4
lib/codeql/rust/elements/TupleStructPat.qll 50b7d89498dbe6737d97325037156c7689fd8d7e776d66fef9551f173fa3f2d6 f42edcf42be877424ecf2f11c90166a90f485249b24d73ed302294299d6a9bcd
lib/codeql/rust/elements/TupleStructPatConstructor.qll 15a15362572ac2dc98ed3257f195f20bb8dfe34a1fe203cf2a1a193ce16c406f 9e590b50cf865f6bc573b6fc17acea073f0d9389be241b01e820d9f3f8f14acb
lib/codeql/rust/elements/TypeRef.qll 223844544eab3e07b6edda805c6344fa8b486aeea7bbe62e4b98e235ce2008d8 7517748b0e7a57c925168f5ce7a31ecc1b59f7521a2095578f599b8d9045a4e5
lib/codeql/rust/elements/TypeRefConstructor.qll f8b2e5ef15517890a8b2d56643f471ae64cc74c420187049e33b182417e72e4f 683611e732b842756e301a77625b385bca0c4969971020c9e11220a1aa665a29
lib/codeql/rust/elements/UnaryOpExpr.qll 32e637510c03653cc28cb9a25a2873e9bf346aeb63ad2d7a571bfcbda45c59ce 044b22dd35491f9eafc6488fff5bc929aed12e2f36ac55883925c876978bf7cf
lib/codeql/rust/elements/UnaryOpExprConstructor.qll 43db7afbd3535b7edc801d99d772233a734f4ed31eeee2ca74e7ab26cae33e87 7345f8d4cb958ee2fa83d3634285f12829bdd1cbac2697236d6fae062313ab6d
lib/codeql/rust/elements/UnderscoreExpr.qll cd49049149e268524412a17394daaef696ddca63f1f452b369172b9643e94d82 228568c12efc7c055f2ff7cc08c2d0ae150f6356f77ccea98b7f8be3d6bb4806
@@ -171,14 +170,14 @@ lib/codeql/rust/generated/MissingPat.qll 0d8034cee20bacf07ebb9337c797f53a25686a1
lib/codeql/rust/generated/Module.qll 2a931a4f2cdb2fee00ed83af045ea63d36b7dbd708e58c30445b5610feaae333 cd62add5c31a509f965aa294f44a1607ec7c62e3a9e3fe9ee063b3c814f4eb62
lib/codeql/rust/generated/OffsetOfExpr.qll 58dfd632efcb48de7fe6ffbcb2192fcf95bfabdb407a751133f63a0e32ae7489 21ebb1b3d66849fc21c04083cfa751eb56c55809cd52664020bd61ccfbe5ea68
lib/codeql/rust/generated/OrPat.qll f8fe5c7b83a08dabcc530484a696274930040ea13501ae20f1426faeec67bcf0 f3adb3148890531b698570a48740335983a5e81977ba4ac651778f940f184398
lib/codeql/rust/generated/ParentChild.qll e1658ad4b3406b882726ed623e3668b99d1353c92c22f2939e2b7fc2b4053711 739da3c782d40cbd83c2b1d752376a0363802b64b950bea61e79cfb63bdd4f6d
lib/codeql/rust/generated/ParentChild.qll f101e2538cd97f54651d995271dda8ecf5d80a204522506b01994a2e37cfac7a 5d1ef956058bb407f3038787b2be2127afdc2a6910a434cce8dd35037c8841a3
lib/codeql/rust/generated/Pat.qll fe1c72856442dbab5655eff93f86c2cbce8d69d9fa1f99a0f9203061ea1112a4 d85d86e8b6c48df733589d186f610b1cd9086629180701e017774bddc62402c7
lib/codeql/rust/generated/PathExpr.qll 3664ed2ad08097e4446b0fdad148118c754f8203541ae588d967ba9d79b6bf21 0d987d2358fe9b42e57585e7ae906de80e9f4ccf7c20e1d9bb7624ffbad96941
lib/codeql/rust/generated/PathPat.qll acc4dda795bae97626a8d0041538f3ba1f0b591c743fed381cf198a8b04653cb c3deee1b3bb9bd37ae3ed4761d8ee2f498384fe5e1f5e31c0f9b99dfd864a0d5
lib/codeql/rust/generated/PureSynthConstructors.qll 5eb1fc4f6a04172c34ae31e4931e4bf1f8b72fbe414c5f644731a45372d13573 5eb1fc4f6a04172c34ae31e4931e4bf1f8b72fbe414c5f644731a45372d13573
lib/codeql/rust/generated/RangeExpr.qll f499d8c1f260d6262a55c1f3640aaee832ed8c9aac922cb2e05fefbca4509053 a01563640bc23fbce9d33da756bc209fd16155dc76a7fed4ba325979723f48a5
lib/codeql/rust/generated/RangePat.qll 6ec95f6cb9c4bd93b38990bb1e3b89b526624305ac6ee7b94e6fb0a2f3db28fc 0e193f3816a7587d5103dba421bc2bf22b869522353d4e3f43d49a792eac6cf4
lib/codeql/rust/generated/Raw.qll fcc1c9f3b06f7c1ae5ad6f7e7ab508c5fbbe9f13a5888db7e1a1e878d53b0f7e 45b6ee33b3ebe83d7f297eb0a9700da42648dc6228caed1e6649e940ea304907
lib/codeql/rust/generated/Raw.qll 8d6b4ff602a89f779b15d84885b1d165ab23e9fc8b5953d1dfd3294daf492d8d 04366012c0d1278ed49b753d1d39cf96fbb16f7319072e2ff9714d1ecdd224c3
lib/codeql/rust/generated/RecordFieldPat.qll 26bed2285d849b9b7ac52d86131eacb40df912db350e423e81fb98c393c08a69 05ed735aecee90901a1bdfae05d9f85d7f6581616eca3a9262fdef6673222f9b
lib/codeql/rust/generated/RecordLitExpr.qll 1d3264446ff57e8b169f1ad6da150b2d457d6b60eda0ff63e2353eb8ef9e9113 f523dd5ce7f4bac0aafab7b27c6cfe766c72a9ee0c92d7a263347e67edf096df
lib/codeql/rust/generated/RecordLitField.qll bc704b56a986f3a399dc9c3dc2b61cca0d40cd389c694b9fe13374780835ffcc ab6b05a87f240a97cc2a8c15bb84a1338ad33ce367619125a8514e8815fd050e
@@ -189,15 +188,15 @@ lib/codeql/rust/generated/RepeatExpr.qll 43aff00e966e4550179d756489e4cbc30618d66
lib/codeql/rust/generated/ReturnExpr.qll 6160f3a14ff1cbd6a297edae015769f90e8e31201639828d8a9d0d6e38c1ef99 b8c8a12f78281e558d230c6959236780758e9645fe22aca697b948535c20f9be
lib/codeql/rust/generated/SlicePat.qll b4de6692eebf1205940e04da963adc20a07b15923c3c3a7a512a24e3bd8342c9 ee9b919983807f39d97cfe8ca66b76bdbfde76db02db5c93268ce22cbddf4213
lib/codeql/rust/generated/Stmt.qll 55688c8f42f6e7fd1b871e572d75fac60d0543e38c4be4638abbb00187651d3d f978006a8453137f989249e849a7c935a090da3a9b0116145da80068760e12fd
lib/codeql/rust/generated/Synth.qll 6d1c4648a7f705bf5d7e8f8081f835c03feb6eee99bbf5fcca825902cb0cac20 620582c3743f8e0172288660bf5b2f344d8696620675ad0a04df20da55ba9c45
lib/codeql/rust/generated/SynthConstructors.qll 15f62ecc76505a326df6a6d61896892ecbacdd1edc8bb4fede39f1a84e36431e 15f62ecc76505a326df6a6d61896892ecbacdd1edc8bb4fede39f1a84e36431e
lib/codeql/rust/generated/Synth.qll 98478a5bd0cf16a11b4dc64d4d7d7d4bcd61ee637b29ae59af93938393f804f9 e254397b85bbf3c2254c163f010cc90d08a5c658eed461778e97346e4e60ff2c
lib/codeql/rust/generated/SynthConstructors.qll 6cfce4c3bfb6c68cf2fa518cf9cadf0fd968219cb97a60be8e471205d459a553 6cfce4c3bfb6c68cf2fa518cf9cadf0fd968219cb97a60be8e471205d459a553
lib/codeql/rust/generated/TupleExpr.qll 13e4dbc1afcabf388c793145cd399789f4014662f2eed1d49cbe96eeb8355413 bfa0708885c120bad24e29deb29641c69a5e5361654f3a144ead9543bfbd7197
lib/codeql/rust/generated/TuplePat.qll 23911b2ac7ee2279df8ef40a6e447437ef0ed62518504b17874a7652bf5e3f4b fc4f6f7ea40754290de194ac55939f08549bd637104baf8dc84ca3938bcbd1f1
lib/codeql/rust/generated/TupleStructPat.qll fff004cce780501eac94fe4b146619a84e02c85cae12ffeba5a4058e8c9738ea 738659f8208aa65d1d8cf601e0d92a90a890d6cbaec51cf04c81fc75a827e30b
lib/codeql/rust/generated/TypeRef.qll 7cc468c2f473ee13c11a97c4360100376560e8fc42f25a136f1500fe31a31533 7cc468c2f473ee13c11a97c4360100376560e8fc42f25a136f1500fe31a31533
lib/codeql/rust/generated/TypeRef.qll 3e8321504060e2e558e6679555e32c8056969806fc367867d4a76f67b9993558 0df712b2e10d366ced1c6518754ba2f56e1a71fc39753234a321c31f46aa3fba
lib/codeql/rust/generated/UnaryOpExpr.qll fd55d4bc9cd1a49d1f38f02fef16771f29bb5fb2512abd18341d56665859d18c f271ef5036410c018f48d6f15b17cb9beaf4111a42fc638ac4ed3db974a5f870
lib/codeql/rust/generated/UnderscoreExpr.qll cd7f615e41562b80d89e413c1c808048da7746fd445f0eb6ad8c5d9996b44d5d cd7f615e41562b80d89e413c1c808048da7746fd445f0eb6ad8c5d9996b44d5d
lib/codeql/rust/generated/Unimplemented.qll 375b7935b7f4103728ece3042282ae82d19e471d7a9fa58c8cbdea31ea0cb113 375b7935b7f4103728ece3042282ae82d19e471d7a9fa58c8cbdea31ea0cb113
lib/codeql/rust/generated/Unimplemented.qll e2b1da6123c7ff71f9ce1133ae2665ac4e1c401084b0eb778aa4ae78cad2d363 e2b1da6123c7ff71f9ce1133ae2665ac4e1c401084b0eb778aa4ae78cad2d363
lib/codeql/rust/generated/UnsafeBlockExpr.qll 8464597373ea46f6391394f02c4ceb93ffe8441b434e6e71907b0a3369f72d8e 8464597373ea46f6391394f02c4ceb93ffe8441b434e6e71907b0a3369f72d8e
lib/codeql/rust/generated/WildPat.qll 8a2cede00ac2941cb94e294ffa81ada9ae6e61d8d8a720ce4f288740345802f8 8a2cede00ac2941cb94e294ffa81ada9ae6e61d8d8a720ce4f288740345802f8
lib/codeql/rust/generated/YeetExpr.qll 2b37cf55ec26958cf226885e99d81c8bbc6ece69fbe92d9fcc8884ee0bc4aad4 e371531507311ea8a9fbaac74442fe9994ae85f0acdb79cc870e5318af52aba9

1
rust/ql/.gitattributes generated vendored
View File

@@ -113,7 +113,6 @@
/lib/codeql/rust/elements/TupleStructPat.qll linguist-generated
/lib/codeql/rust/elements/TupleStructPatConstructor.qll linguist-generated
/lib/codeql/rust/elements/TypeRef.qll linguist-generated
/lib/codeql/rust/elements/TypeRefConstructor.qll linguist-generated
/lib/codeql/rust/elements/UnaryOpExpr.qll linguist-generated
/lib/codeql/rust/elements/UnaryOpExprConstructor.qll linguist-generated
/lib/codeql/rust/elements/UnderscoreExpr.qll linguist-generated

View File

@@ -1,14 +0,0 @@
// generated by codegen, remove this comment if you wish to edit this file
/**
* This module defines the hook used internally to tweak the characteristic predicate of
* `TypeRef` synthesized instances.
* INTERNAL: Do not use.
*/
private import codeql.rust.generated.Raw
/**
* The characteristic predicate of `TypeRef` synthesized instances.
* INTERNAL: Do not use.
*/
predicate constructTypeRef(Raw::TypeRef id) { any() }

View File

@@ -174,21 +174,6 @@ private module Impl {
)
}
private Element getImmediateChildOfUnimplemented(
Unimplemented e, int index, string partialPredicateCall
) {
exists(int b, int bAstNode, int n |
b = 0 and
bAstNode = b + 1 + max(int i | i = -1 or exists(getImmediateChildOfAstNode(e, i, _)) | i) and
n = bAstNode and
(
none()
or
result = getImmediateChildOfAstNode(e, index - b, partialPredicateCall)
)
)
}
private Element getImmediateChildOfArrayExpr(ArrayExpr e, int index, string partialPredicateCall) {
exists(int b, int bExpr, int n |
b = 0 and
@@ -1081,6 +1066,26 @@ private module Impl {
)
}
private Element getImmediateChildOfUnimplemented(
Unimplemented e, int index, string partialPredicateCall
) {
exists(int b, int bDeclaration, int bTypeRef, int n |
b = 0 and
bDeclaration =
b + 1 + max(int i | i = -1 or exists(getImmediateChildOfDeclaration(e, i, _)) | i) and
bTypeRef =
bDeclaration + 1 + max(int i | i = -1 or exists(getImmediateChildOfTypeRef(e, i, _)) | i) and
n = bTypeRef and
(
none()
or
result = getImmediateChildOfDeclaration(e, index - b, partialPredicateCall)
or
result = getImmediateChildOfTypeRef(e, index - bDeclaration, partialPredicateCall)
)
)
}
private Element getImmediateChildOfWildPat(WildPat e, int index, string partialPredicateCall) {
exists(int b, int bPat, int n |
b = 0 and
@@ -1227,10 +1232,6 @@ private module Impl {
or
result = getImmediateChildOfRecordLitField(e, index, partialAccessor)
or
result = getImmediateChildOfTypeRef(e, index, partialAccessor)
or
result = getImmediateChildOfUnimplemented(e, index, partialAccessor)
or
result = getImmediateChildOfAwaitExpr(e, index, partialAccessor)
or
result = getImmediateChildOfBecomeExpr(e, index, partialAccessor)
@@ -1325,6 +1326,8 @@ private module Impl {
or
result = getImmediateChildOfUnderscoreExpr(e, index, partialAccessor)
or
result = getImmediateChildOfUnimplemented(e, index, partialAccessor)
or
result = getImmediateChildOfWildPat(e, index, partialAccessor)
or
result = getImmediateChildOfYeetExpr(e, index, partialAccessor)

View File

@@ -111,16 +111,7 @@ module Raw {
/**
* INTERNAL: Do not use.
*/
class TypeRef extends @type_ref, AstNode {
override string toString() { result = "TypeRef" }
}
/**
* INTERNAL: Do not use.
*/
class Unimplemented extends @unimplemented, AstNode {
override string toString() { result = "Unimplemented" }
}
class TypeRef extends @type_ref, AstNode { }
/**
* INTERNAL: Do not use.
@@ -931,6 +922,13 @@ module Raw {
override string toString() { result = "UnderscoreExpr" }
}
/**
* INTERNAL: Do not use.
*/
class Unimplemented extends @unimplemented, Declaration, TypeRef {
override string toString() { result = "Unimplemented" }
}
/**
* INTERNAL: Do not use.
*/

View File

@@ -227,10 +227,6 @@ module Synth {
* INTERNAL: Do not use.
*/
TTupleStructPat(Raw::TupleStructPat id) { constructTupleStructPat(id) } or
/**
* INTERNAL: Do not use.
*/
TTypeRef(Raw::TypeRef id) { constructTypeRef(id) } or
/**
* INTERNAL: Do not use.
*/
@@ -270,7 +266,7 @@ module Synth {
*/
class TAstNode =
TDeclaration or TExpr or TLabel or TMatchArm or TPat or TRecordFieldPat or TRecordLitField or
TStmt or TTypeRef or TUnimplemented;
TStmt or TTypeRef;
/**
* INTERNAL: Do not use.
@@ -280,7 +276,7 @@ module Synth {
/**
* INTERNAL: Do not use.
*/
class TDeclaration = TFunction or TModule;
class TDeclaration = TFunction or TModule or TUnimplemented;
/**
* INTERNAL: Do not use.
@@ -310,6 +306,11 @@ module Synth {
*/
class TStmt = TExprStmt or TItemStmt or TLetStmt;
/**
* INTERNAL: Do not use.
*/
class TTypeRef = TUnimplemented;
/**
* INTERNAL: Do not use.
* Converts a raw element to a synthesized `TAsyncBlockExpr`, if possible.
@@ -681,13 +682,6 @@ module Synth {
cached
TTupleStructPat convertTupleStructPatFromRaw(Raw::Element e) { result = TTupleStructPat(e) }
/**
* INTERNAL: Do not use.
* Converts a raw element to a synthesized `TTypeRef`, if possible.
*/
cached
TTypeRef convertTypeRefFromRaw(Raw::Element e) { result = TTypeRef(e) }
/**
* INTERNAL: Do not use.
* Converts a raw element to a synthesized `TUnaryOpExpr`, if possible.
@@ -771,8 +765,6 @@ module Synth {
result = convertStmtFromRaw(e)
or
result = convertTypeRefFromRaw(e)
or
result = convertUnimplementedFromRaw(e)
}
/**
@@ -797,6 +789,8 @@ module Synth {
result = convertFunctionFromRaw(e)
or
result = convertModuleFromRaw(e)
or
result = convertUnimplementedFromRaw(e)
}
/**
@@ -934,6 +928,13 @@ module Synth {
result = convertLetStmtFromRaw(e)
}
/**
* INTERNAL: Do not use.
* Converts a raw DB element to a synthesized `TTypeRef`, if possible.
*/
cached
TTypeRef convertTypeRefFromRaw(Raw::Element e) { result = convertUnimplementedFromRaw(e) }
/**
* INTERNAL: Do not use.
* Converts a synthesized `TAsyncBlockExpr` to a raw DB element, if possible.
@@ -1305,13 +1306,6 @@ module Synth {
cached
Raw::Element convertTupleStructPatToRaw(TTupleStructPat e) { e = TTupleStructPat(result) }
/**
* INTERNAL: Do not use.
* Converts a synthesized `TTypeRef` to a raw DB element, if possible.
*/
cached
Raw::Element convertTypeRefToRaw(TTypeRef e) { e = TTypeRef(result) }
/**
* INTERNAL: Do not use.
* Converts a synthesized `TUnaryOpExpr` to a raw DB element, if possible.
@@ -1395,8 +1389,6 @@ module Synth {
result = convertStmtToRaw(e)
or
result = convertTypeRefToRaw(e)
or
result = convertUnimplementedToRaw(e)
}
/**
@@ -1421,6 +1413,8 @@ module Synth {
result = convertFunctionToRaw(e)
or
result = convertModuleToRaw(e)
or
result = convertUnimplementedToRaw(e)
}
/**
@@ -1557,4 +1551,11 @@ module Synth {
or
result = convertLetStmtToRaw(e)
}
/**
* INTERNAL: Do not use.
* Converts a synthesized `TTypeRef` to a raw DB element, if possible.
*/
cached
Raw::Element convertTypeRefToRaw(TTypeRef e) { result = convertUnimplementedToRaw(e) }
}

View File

@@ -56,7 +56,6 @@ import codeql.rust.elements.SlicePatConstructor
import codeql.rust.elements.TupleExprConstructor
import codeql.rust.elements.TuplePatConstructor
import codeql.rust.elements.TupleStructPatConstructor
import codeql.rust.elements.TypeRefConstructor
import codeql.rust.elements.UnaryOpExprConstructor
import codeql.rust.elements.UnderscoreExprConstructor
import codeql.rust.elements.UnimplementedConstructor

View File

@@ -17,7 +17,5 @@ module Generated {
* INTERNAL: Do not reference the `Generated::TypeRef` class directly.
* Use the subclass `TypeRef`, where the following predicates are available.
*/
class TypeRef extends Synth::TTypeRef, AstNode {
override string getAPrimaryQlClass() { result = "TypeRef" }
}
class TypeRef extends Synth::TTypeRef, AstNode { }
}

View File

@@ -6,7 +6,8 @@
private import codeql.rust.generated.Synth
private import codeql.rust.generated.Raw
import codeql.rust.elements.AstNode
import codeql.rust.elements.Declaration
import codeql.rust.elements.TypeRef
/**
* INTERNAL: This module contains the fully generated definition of `Unimplemented` and should not
@@ -17,7 +18,7 @@ module Generated {
* INTERNAL: Do not reference the `Generated::Unimplemented` class directly.
* Use the subclass `Unimplemented`, where the following predicates are available.
*/
class Unimplemented extends Synth::TUnimplemented, AstNode {
class Unimplemented extends Synth::TUnimplemented, Declaration, TypeRef {
override string getAPrimaryQlClass() { result = "Unimplemented" }
}
}

View File

@@ -137,12 +137,12 @@ locatable_locations(
| @record_lit_field
| @stmt
| @type_ref
| @unimplemented
;
@declaration =
@function
| @module
| @unimplemented
;
@expr =
@@ -233,13 +233,9 @@ record_lit_fields(
| @let_stmt
;
type_refs(
unique int id: @type_ref
);
unimplementeds(
unique int id: @unimplemented
);
@type_ref =
@unimplemented
;
@array_expr =
@element_list_expr
@@ -801,6 +797,10 @@ underscore_exprs(
unique int id: @underscore_expr
);
unimplementeds(
unique int id: @unimplemented
);
wild_pats(
unique int id: @wild_pat
);

View File

@@ -29,11 +29,6 @@ class AstNode(Locatable):
pass
@qltest.skip
class Unimplemented(AstNode):
pass
class Declaration(AstNode):
pass
@@ -95,7 +90,7 @@ class MissingExpr(Expr):
class PathExpr(Expr):
path: Unimplemented | child
path: "Unimplemented" | child
# If {
# condition: ExprId,
@@ -196,7 +191,7 @@ class MethodCallExpr(Expr):
receiver: Expr | child
method_name: string
args: list[Expr] | child
generic_args: optional[Unimplemented] | child
generic_args: optional["Unimplemented"] | child
# pub struct MatchArm {
# pub pat: PatId,
@@ -287,7 +282,7 @@ class RecordLitField(AstNode):
class RecordLitExpr(Expr):
path: optional[Unimplemented] | child
path: optional["Unimplemented"] | child
fields: list[RecordLitField] | child
spread: optional[Expr] | child
has_ellipsis: predicate
@@ -514,7 +509,7 @@ class OrPat(Pat):
class RecordPat(Pat):
path: optional[Unimplemented] | child
path: optional["Unimplemented"] | child
args: list[RecordFieldPat] | child
has_ellipsis: predicate
@@ -535,7 +530,7 @@ class SlicePat(Pat):
class PathPat(Pat):
path: Unimplemented | child
path: "Unimplemented" | child
# Lit(ExprId),
@@ -554,7 +549,7 @@ class BindPat(Pat):
class TupleStructPat(Pat):
path: optional[Unimplemented] | child
path: optional["Unimplemented"] | child
args: list[Pat] | child
ellipsis_index: optional[int]
@@ -575,3 +570,8 @@ class BoxPat(Pat):
class ConstBlockPat(Pat):
expr: Expr | child
@qltest.skip
class Unimplemented(Declaration, TypeRef):
pass