Rust: Make Crate a sub class of Locatable

This commit is contained in:
Tom Hvitved
2025-03-14 11:55:33 +01:00
parent cf0b3b5727
commit 0dd59cbb25
13 changed files with 172 additions and 152 deletions

View File

@@ -1,2 +1,2 @@
mod.rs 4bcb9def847469aae9d8649461546b7c21ec97cf6e63d3cf394e339915ce65d7 4bcb9def847469aae9d8649461546b7c21ec97cf6e63d3cf394e339915ce65d7
top.rs 4b7dee6ebdbb2f8bd2f387cbb71e0481475de0a94c0baaac4699f19551256d65 4b7dee6ebdbb2f8bd2f387cbb71e0481475de0a94c0baaac4699f19551256d65
top.rs 413fd08f7bc22169688be065bd89fa80f924fcbf88ce41e6a9db6872b2a6a84e 413fd08f7bc22169688be065bd89fa80f924fcbf88ce41e6a9db6872b2a6a84e

View File

@@ -22,54 +22,6 @@ impl trap::TrapClass for Element {
fn class_name() -> &'static str { "Element" }
}
#[derive(Debug)]
pub struct Crate {
pub id: trap::TrapId<Crate>,
pub name: Option<String>,
pub version: Option<String>,
pub module: Option<trap::Label<Module>>,
pub cfg_options: Vec<String>,
pub dependencies: Vec<trap::Label<Crate>>,
}
impl trap::TrapEntry for Crate {
fn extract_id(&mut self) -> trap::TrapId<Self> {
std::mem::replace(&mut self.id, trap::TrapId::Star)
}
fn emit(self, id: trap::Label<Self>, out: &mut trap::Writer) {
out.add_tuple("crates", vec![id.into()]);
if let Some(v) = self.name {
out.add_tuple("crate_names", vec![id.into(), v.into()]);
}
if let Some(v) = self.version {
out.add_tuple("crate_versions", vec![id.into(), v.into()]);
}
if let Some(v) = self.module {
out.add_tuple("crate_modules", vec![id.into(), v.into()]);
}
for (i, v) in self.cfg_options.into_iter().enumerate() {
out.add_tuple("crate_cfg_options", vec![id.into(), i.into(), v.into()]);
}
for (i, v) in self.dependencies.into_iter().enumerate() {
out.add_tuple("crate_dependencies", vec![id.into(), i.into(), v.into()]);
}
}
}
impl trap::TrapClass for Crate {
fn class_name() -> &'static str { "Crate" }
}
impl From<trap::Label<Crate>> for trap::Label<Element> {
fn from(value: trap::Label<Crate>) -> Self {
// SAFETY: this is safe because in the dbscheme Crate is a subclass of Element
unsafe {
Self::from_untyped(value.as_untyped())
}
}
}
#[derive(Debug)]
pub struct ExtractorStep {
pub id: trap::TrapId<ExtractorStep>,
@@ -167,6 +119,63 @@ impl From<trap::Label<AstNode>> for trap::Label<Locatable> {
}
}
#[derive(Debug)]
pub struct Crate {
pub id: trap::TrapId<Crate>,
pub name: Option<String>,
pub version: Option<String>,
pub module: Option<trap::Label<Module>>,
pub cfg_options: Vec<String>,
pub dependencies: Vec<trap::Label<Crate>>,
}
impl trap::TrapEntry for Crate {
fn extract_id(&mut self) -> trap::TrapId<Self> {
std::mem::replace(&mut self.id, trap::TrapId::Star)
}
fn emit(self, id: trap::Label<Self>, out: &mut trap::Writer) {
out.add_tuple("crates", vec![id.into()]);
if let Some(v) = self.name {
out.add_tuple("crate_names", vec![id.into(), v.into()]);
}
if let Some(v) = self.version {
out.add_tuple("crate_versions", vec![id.into(), v.into()]);
}
if let Some(v) = self.module {
out.add_tuple("crate_modules", vec![id.into(), v.into()]);
}
for (i, v) in self.cfg_options.into_iter().enumerate() {
out.add_tuple("crate_cfg_options", vec![id.into(), i.into(), v.into()]);
}
for (i, v) in self.dependencies.into_iter().enumerate() {
out.add_tuple("crate_dependencies", vec![id.into(), i.into(), v.into()]);
}
}
}
impl trap::TrapClass for Crate {
fn class_name() -> &'static str { "Crate" }
}
impl From<trap::Label<Crate>> for trap::Label<Element> {
fn from(value: trap::Label<Crate>) -> Self {
// SAFETY: this is safe because in the dbscheme Crate is a subclass of Element
unsafe {
Self::from_untyped(value.as_untyped())
}
}
}
impl From<trap::Label<Crate>> for trap::Label<Locatable> {
fn from(value: trap::Label<Crate>) -> Self {
// SAFETY: this is safe because in the dbscheme Crate is a subclass of Locatable
unsafe {
Self::from_untyped(value.as_untyped())
}
}
}
#[derive(Debug)]
pub struct Missing {
pub id: trap::TrapId<Missing>,

View File

@@ -43,7 +43,7 @@ lib/codeql/rust/elements/ConstArg.qll f37b34417503bbd2f3ce09b3211d8fa71f6a954970
lib/codeql/rust/elements/ConstBlockPat.qll a25f42b84dbeb33e10955735ef53b8bb7e3258522d6d1a9068f19adaf1af89d9 eeb816d2b54db77a1e7bb70e90b68d040a0cd44e9d44455a223311c3615c5e6e
lib/codeql/rust/elements/ConstParam.qll 248db1e3abef6943326c42478a15f148f8cdaa25649ef5578064b15924c53351 28babba3aea28a65c3fe3b3db6cb9c86f70d7391e9d6ef9188eb2e4513072f9f
lib/codeql/rust/elements/ContinueExpr.qll 9f27c5d5c819ad0ebc5bd10967ba8d33a9dc95b9aae278fcfb1fcf9216bda79c 0dc061445a6b89854fdce92aaf022fdc76b724511a50bb777496ce75c9ecb262
lib/codeql/rust/elements/Crate.qll 67a3b953a04244e2fcebe7a18be13bc7fdb8781669819e473823a9168f3f5412 aef65281efbc8c7e7b3747693626718ca25b3d9a90aa42221de00998eca44efe
lib/codeql/rust/elements/Crate.qll 5e3fb55fee69b98253f7293306384011fd4a6121e10a59c1c945b34c28db5973 69459c56308f8b0fcf92cfba09a3bd238af6cf51f5c06208316a956833098e5f
lib/codeql/rust/elements/DynTraitTypeRepr.qll 5953263ec1e77613170c13b5259b22a71c206a7e08841d2fa1a0b373b4014483 d4380c6cc460687dcd8598df27cad954ef4f508f1117a82460d15d295a7b64ab
lib/codeql/rust/elements/Element.qll 0b62d139fef54ed2cf2e2334806aa9bfbc036c9c2085d558f15a42cc3fa84c48 24b999b93df79383ef27ede46e38da752868c88a07fe35fcff5d526684ba7294
lib/codeql/rust/elements/Enum.qll 2f122b042519d55e221fceac72fce24b30d4caf1947b25e9b68ee4a2095deb11 83a47445145e4fda8c3631db602a42dbb7a431f259eddf5c09dccd86f6abdd0e
@@ -502,7 +502,7 @@ lib/codeql/rust/elements/internal/generated/ConstArg.qll e2451cac6ee464f5b64883d
lib/codeql/rust/elements/internal/generated/ConstBlockPat.qll 7526d83ee9565d74776f42db58b1a2efff6fb324cfc7137f51f2206fee815d79 0ab3c22908ff790e7092e576a5df3837db33c32a7922a513a0f5e495729c1ac5
lib/codeql/rust/elements/internal/generated/ConstParam.qll 310342603959a4d521418caec45b585b97e3a5bf79368769c7150f52596a7266 a5dd92f0b24d7dbdaea2daedba3c8d5f700ec7d3ace81ca368600da2ad610082
lib/codeql/rust/elements/internal/generated/ContinueExpr.qll e2010feb14fb6edeb83a991d9357e50edb770172ddfde2e8670b0d3e68169f28 48d09d661e1443002f6d22b8710e22c9c36d9daa9cde09c6366a61e960d717cb
lib/codeql/rust/elements/internal/generated/Crate.qll 6d28f07d4ddaf077119590a007a8cfad0c86cf0efabbde689fb4092577b883df d43013163916aa83f281314a72d02d7566e1f505aa36cfd8060a760b06b02683
lib/codeql/rust/elements/internal/generated/Crate.qll 2d7124b095738cb13dca8e1c402986ae575062f19104c331a6928dd86f8f01e6 8cd20d12e3a5f9202a12c81479fb9d2741109eb0b74c1541c6aa4258501b0478
lib/codeql/rust/elements/internal/generated/DynTraitTypeRepr.qll a9d540717af1f00dbea1c683fd6b846cddfb2968c7f3e021863276f123337787 1972efb9bca7aae9a9708ca6dcf398e5e8c6d2416a07d525dba1649b80fbe4d1
lib/codeql/rust/elements/internal/generated/Element.qll fb483b636180c699181c8aff83bc471b2c416206694f7028c671015918547663 542d1b9ae80c997974c94db3655887186df3921a8fa3f565eaf292dcfdac3c4c
lib/codeql/rust/elements/internal/generated/Enum.qll 4f4cbc9cd758c20d476bc767b916c62ba434d1750067d0ffb63e0821bb95ec86 3da735d54022add50cec0217bbf8ec4cf29b47f4851ee327628bcdd6454989d0
@@ -576,7 +576,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 eec4e7672ef5f07752044348d45882f0a849b295dfb17169e910ed0bfca3c162 29a9cc9b2870b1c6240cc53a9a70c4623381219a8f88ea1656b6828d16ef51c7
lib/codeql/rust/elements/internal/generated/ParentChild.qll 17bad59de9a8b6d3845ad00ac55c5bcddac8d187f17764d9b164451d2221af3f 6fbd842f262bbcb105045aa90da7549ce51e0fb5599fc1e9ffae907108ba1f4a
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 8e47e91aff3f8c60f1ee8cb3887b8e4936c38e4665d052f2c92a939a969aac29 2c28beb89cabd7c7c91a5bc65c874f414cb96bbefde37b25811b61089a8a0053
@@ -591,7 +591,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 4b60a7c36b770156d3710d811247bc1607c851a926d1546271f166af5b68c01f f65ba77cb2135b4a0d37d8c3e19e49f368426b14c7e48730f3fb9e65f9d7b9c5
lib/codeql/rust/elements/internal/generated/Raw.qll 961cd311a08aa3a3de2761a8f87d422f2d75e9debea466543d5803e24b6b4315 ee699aa5d61fe3331a747de9b84c2edef6b8ee04644b84506544cb88f93902a3
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
@@ -617,7 +617,7 @@ lib/codeql/rust/elements/internal/generated/Static.qll 0b336767104d2b852b9acd234
lib/codeql/rust/elements/internal/generated/Stmt.qll 8473ff532dd5cc9d7decaddcd174b94d610f6ca0aec8e473cc051dad9f3db917 6ef7d2b5237c2dbdcacbf7d8b39109d4dc100229f2b28b5c9e3e4fbf673ba72b
lib/codeql/rust/elements/internal/generated/StmtList.qll a667193e32341e17400867c6e359878c4e645ef9f5f4d97676afc0283a33a026 a320ed678ee359302e2fc1b70a9476705cd616fcfa44a499d32f0c7715627f73
lib/codeql/rust/elements/internal/generated/Struct.qll 4d57f0db12dc7ad3e31e750a24172ef1505406b4dab16386af0674bd18bf8f4b 1a73c83df926b996f629316f74c61ea775be04532ab61b56af904223354f033e
lib/codeql/rust/elements/internal/generated/Synth.qll 554d5979ddb7afa42aa4d373cafcffd086e017104130f4a661264ee1c7b54653 059fa863ddab905050e1bbb4669722a14721b40b193bb91f1642da9a36d09018
lib/codeql/rust/elements/internal/generated/Synth.qll b1428cbc752be287540c58a3931ebcc033f961e5d6883d6260189310901f1663 3001eb4a1b9a050d7b0abb875fea2e26b29522ecb8d2719ebf6b68f347fee5da
lib/codeql/rust/elements/internal/generated/SynthConstructors.qll f6321ef2a74bb3c869cb3d3fc7753ec90d03bf2c620597f7f1fea636309a3575 f6321ef2a74bb3c869cb3d3fc7753ec90d03bf2c620597f7f1fea636309a3575
lib/codeql/rust/elements/internal/generated/Token.qll 77a91a25ca5669703cf3a4353b591cef4d72caa6b0b9db07bb9e005d69c848d1 2fdffc4882ed3a6ca9ac6d1fb5f1ac5a471ca703e2ffdc642885fa558d6e373b
lib/codeql/rust/elements/internal/generated/TokenTree.qll 8577c2b097c1be2f0f7daa5acfcf146f78674a424d99563e08a84dd3e6d91b46 d2f30764e84dbfc0a6a5d3d8a5f935cd432413688cb32da9c94e420fbc10665c

View File

@@ -4,7 +4,7 @@
*/
private import internal.CrateImpl
import codeql.rust.elements.Element
import codeql.rust.elements.Locatable
import codeql.rust.elements.Module
final class Crate = Impl::Crate;

View File

@@ -11,6 +11,8 @@ private import codeql.rust.elements.internal.generated.Crate
* be referenced directly.
*/
module Impl {
private import rust
class Crate extends Generated::Crate {
override string toString() { result = strictconcat(int i | | this.toStringPart(i) order by i) }
@@ -25,5 +27,7 @@ module Impl {
or
i = 4 and result = ")"
}
override Location getLocation() { result = this.getModule().getLocation() }
}
}

View File

@@ -7,7 +7,7 @@
private import codeql.rust.elements.internal.generated.Synth
private import codeql.rust.elements.internal.generated.Raw
import codeql.rust.elements.Crate
import codeql.rust.elements.internal.ElementImpl::Impl as ElementImpl
import codeql.rust.elements.internal.LocatableImpl::Impl as LocatableImpl
import codeql.rust.elements.Module
private class CrateAlias = Crate;
@@ -21,7 +21,7 @@ module Generated {
* INTERNAL: Do not reference the `Generated::Crate` class directly.
* Use the subclass `Crate`, where the following predicates are available.
*/
class Crate extends Synth::TCrate, ElementImpl::Element {
class Crate extends Synth::TCrate, LocatableImpl::Locatable {
override string getAPrimaryQlClass() { result = "Crate" }
/**

View File

@@ -12,19 +12,6 @@ private module Impl {
none()
}
private Element getImmediateChildOfCrate(Crate e, int index, string partialPredicateCall) {
exists(int b, int bElement, int n |
b = 0 and
bElement = b + 1 + max(int i | i = -1 or exists(getImmediateChildOfElement(e, i, _)) | i) and
n = bElement and
(
none()
or
result = getImmediateChildOfElement(e, index - b, partialPredicateCall)
)
)
}
private Element getImmediateChildOfExtractorStep(
ExtractorStep e, int index, string partialPredicateCall
) {
@@ -81,6 +68,19 @@ private module Impl {
)
}
private Element getImmediateChildOfCrate(Crate e, int index, string partialPredicateCall) {
exists(int b, int bLocatable, int n |
b = 0 and
bLocatable = b + 1 + max(int i | i = -1 or exists(getImmediateChildOfLocatable(e, i, _)) | i) and
n = bLocatable and
(
none()
or
result = getImmediateChildOfLocatable(e, index - b, partialPredicateCall)
)
)
}
private Element getImmediateChildOfFormat(Format e, int index, string partialPredicateCall) {
exists(
int b, int bLocatable, int n, int nArgumentRef, int nWidthArgument, int nPrecisionArgument
@@ -4063,10 +4063,10 @@ private module Impl {
// * none() simplifies generation, as we can append `or ...` without a special case for the first item
none()
or
result = getImmediateChildOfCrate(e, index, partialAccessor)
or
result = getImmediateChildOfExtractorStep(e, index, partialAccessor)
or
result = getImmediateChildOfCrate(e, index, partialAccessor)
or
result = getImmediateChildOfFormat(e, index, partialAccessor)
or
result = getImmediateChildOfFormatArgument(e, index, partialAccessor)

View File

@@ -12,38 +12,6 @@ module Raw {
string toString() { none() }
}
/**
* INTERNAL: Do not use.
*/
class Crate extends @crate, Element {
override string toString() { result = "Crate" }
/**
* Gets the name of this crate, if it exists.
*/
string getName() { crate_names(this, result) }
/**
* Gets the version of this crate, if it exists.
*/
string getVersion() { crate_versions(this, result) }
/**
* Gets the module of this crate, if it exists.
*/
Module getModule() { crate_modules(this, result) }
/**
* Gets the `index`th cfg option of this crate (0-based).
*/
string getCfgOption(int index) { crate_cfg_options(this, index, result) }
/**
* Gets the `index`th dependency of this crate (0-based).
*/
Crate getDependency(int index) { crate_dependencies(this, index, result) }
}
/**
* INTERNAL: Do not use.
*/
@@ -85,6 +53,38 @@ module Raw {
*/
class AstNode extends @ast_node, Locatable { }
/**
* INTERNAL: Do not use.
*/
class Crate extends @crate, Locatable {
override string toString() { result = "Crate" }
/**
* Gets the name of this crate, if it exists.
*/
string getName() { crate_names(this, result) }
/**
* Gets the version of this crate, if it exists.
*/
string getVersion() { crate_versions(this, result) }
/**
* Gets the module of this crate, if it exists.
*/
Module getModule() { crate_modules(this, result) }
/**
* Gets the `index`th cfg option of this crate (0-based).
*/
string getCfgOption(int index) { crate_cfg_options(this, index, result) }
/**
* Gets the `index`th dependency of this crate (0-based).
*/
Crate getDependency(int index) { crate_dependencies(this, index, result) }
}
/**
* INTERNAL: Do not use.
* The base class marking errors during parsing or resolution.

View File

@@ -778,7 +778,7 @@ module Synth {
/**
* INTERNAL: Do not use.
*/
class TLocatable = TAstNode or TFormat or TFormatArgument;
class TLocatable = TAstNode or TCrate or TFormat or TFormatArgument;
/**
* INTERNAL: Do not use.
@@ -2060,8 +2060,6 @@ module Synth {
* Converts a raw DB element to a synthesized `TElement`, if possible.
*/
TElement convertElementFromRaw(Raw::Element e) {
result = convertCrateFromRaw(e)
or
result = convertExtractorStepFromRaw(e)
or
result = convertLocatableFromRaw(e)
@@ -2248,6 +2246,8 @@ module Synth {
TLocatable convertLocatableFromRaw(Raw::Element e) {
result = convertAstNodeFromRaw(e)
or
result = convertCrateFromRaw(e)
or
result = convertFormatFromRaw(e)
or
result = convertFormatArgumentFromRaw(e)
@@ -3638,8 +3638,6 @@ module Synth {
* Converts a synthesized `TElement` to a raw DB element, if possible.
*/
Raw::Element convertElementToRaw(TElement e) {
result = convertCrateToRaw(e)
or
result = convertExtractorStepToRaw(e)
or
result = convertLocatableToRaw(e)
@@ -3826,6 +3824,8 @@ module Synth {
Raw::Element convertLocatableToRaw(TLocatable e) {
result = convertAstNodeToRaw(e)
or
result = convertCrateToRaw(e)
or
result = convertFormatToRaw(e)
or
result = convertFormatArgumentToRaw(e)

View File

@@ -120,48 +120,11 @@ locatable_locations(
// from schema
@element =
@crate
| @extractor_step
@extractor_step
| @locatable
| @unextracted
;
crates(
unique int id: @crate
);
#keyset[id]
crate_names(
int id: @crate ref,
string name: string ref
);
#keyset[id]
crate_versions(
int id: @crate ref,
string version: string ref
);
#keyset[id]
crate_modules(
int id: @crate ref,
int module: @module ref
);
#keyset[id, index]
crate_cfg_options(
int id: @crate ref,
int index: int ref,
string cfg_option: string ref
);
#keyset[id, index]
crate_dependencies(
int id: @crate ref,
int index: int ref,
int dependency: @crate ref
);
extractor_steps(
unique int id: @extractor_step,
string action: string ref,
@@ -176,6 +139,7 @@ extractor_step_files(
@locatable =
@ast_node
| @crate
;
@unextracted =
@@ -251,6 +215,42 @@ extractor_step_files(
| @where_pred
;
crates(
unique int id: @crate
);
#keyset[id]
crate_names(
int id: @crate ref,
string name: string ref
);
#keyset[id]
crate_versions(
int id: @crate ref,
string version: string ref
);
#keyset[id]
crate_modules(
int id: @crate ref,
int module: @module ref
);
#keyset[id, index]
crate_cfg_options(
int id: @crate ref,
int index: int ref,
string cfg_option: string ref
);
#keyset[id, index]
crate_dependencies(
int id: @crate ref,
int index: int ref,
int dependency: @crate ref
);
missings(
unique int id: @missing
);

View File

@@ -101,14 +101,16 @@
#-----| -> Crate(getopts@0.2.21)
#-----| -> Crate(libc@0.2.169)
#-----| Crate(test@0.0.1)
lib.rs:
# 0| Crate(test@0.0.1)
#-----| -> Crate(core@0.0.0)
#-----| -> Crate(std@0.0.0)
#-----| -> Crate(alloc@0.0.0)
#-----| -> Crate(proc_macro@0.0.0)
#-----| -> Crate(test@0.0.0)
#-----| Crate(main@0.0.1)
main.rs:
# 0| Crate(main@0.0.1)
#-----| -> Crate(core@0.0.0)
#-----| -> Crate(std@0.0.0)
#-----| -> Crate(alloc@0.0.0)

View File

@@ -6,6 +6,11 @@
import rust
query predicate nodes(Crate c) { any() }
class MyCrate extends Crate {
// avoid printing locations for crates outside of the test folder
Location getLocation() { result = super.getLocation() and this.fromSource() }
}
query predicate edges(Crate c1, Crate c2) { c1.getADependency() = c2 }
query predicate nodes(MyCrate c) { any() }
query predicate edges(MyCrate c1, MyCrate c2) { c1.getADependency() = c2 }

View File

@@ -113,7 +113,7 @@ class ExtractorStep(Element):
duration_ms: int
class Crate(Element):
class Crate(Locatable):
name: optional[string]
version: optional[string]
module: optional["Module"]