Skip to main content

in_use_version

Function in_use_version 

Source
pub fn in_use_version(
    dep: &dyn Dependency,
    normalized_name: &str,
    resolved_versions: &HashMap<PackageName, ConcreteVersion>,
    formatter: &dyn EcosystemFormatter,
    ecosystem: EcosystemId,
) -> Option<String>
Expand description

The version of dep this project treats as actually in use.

The lock-file-resolved version, else the declared requirement when it is already concrete (concrete_pin_version). None when neither applies.

A dependency whose manifest requirement is itself the resolved version (crate::lsp_helpers::RequirementResolution::manifest_requirement_is_resolved_version — a Go require-directive dependency) skips the lockfile step entirely, going straight to the declared requirement (go.sum is unreliable there — a checksum ledger that go get/go build only ever append to, so its last-occurrence-wins parse can surface a version still recorded in the file but no longer selected by Go’s MVS). Shared by deps-lsp’s OSV target selection, its yanked-version check, and the yanked-diagnostic consistency check in super::diagnostics::generate_diagnostics_from_cache (#394 S1) — all three need “what version does the user actually have” for the same reason: querying a fabricated version produces a silent false negative.

§Examples

use deps_core::lsp_helpers::{
    DiagnosticMessages, DiagnosticPolicy, OsvNaming, PackageNaming, PackageRendering,
    RequirementResolution, SourcePolicy, in_use_version,
};
use deps_core::{ConcreteVersion, Dependency, EcosystemId, PackageName, VersionReq};
use std::any::Any;
use std::collections::HashMap;
use tower_lsp_server::ls_types::Range;

struct SimpleDep {
    name: PackageName,
    version_req: Option<VersionReq>,
}

impl Dependency for SimpleDep {
    fn name(&self) -> &PackageName {
        &self.name
    }
    fn name_range(&self) -> Range {
        Range::default()
    }
    fn version_requirement(&self) -> Option<&VersionReq> {
        self.version_req.as_ref()
    }
    fn version_range(&self) -> Option<Range> {
        None
    }
    fn source(&self) -> deps_core::parser::DependencySource {
        deps_core::parser::DependencySource::Registry
    }
    fn as_any(&self) -> &dyn Any {
        self
    }
}

struct SimpleFormatter;
impl PackageNaming for SimpleFormatter {}
impl PackageRendering for SimpleFormatter {
    fn format_version_for_text_edit(&self, version: &ConcreteVersion) -> String {
        version.to_string()
    }
    fn package_url(&self, name: &PackageName) -> String {
        name.to_string()
    }
}
impl RequirementResolution for SimpleFormatter {}
impl DiagnosticMessages for SimpleFormatter {}
impl DiagnosticPolicy for SimpleFormatter {}
impl SourcePolicy for SimpleFormatter {}
impl OsvNaming for SimpleFormatter {}

let dep = SimpleDep {
    name: PackageName::new("time"),
    version_req: Some(VersionReq::new("=0.1.43")),
};
let resolved_versions: HashMap<PackageName, ConcreteVersion> = HashMap::new();

// No lock file, but the requirement is already an exact pin — falls
// back to it, stripped of its `=` marker.
assert_eq!(
    in_use_version(&dep, "time", &resolved_versions, &SimpleFormatter, EcosystemId::Cargo),
    Some("0.1.43".to_string())
);