lisette-semantics 0.2.17

Little language inspired by Rust that compiles to Go
Documentation
use diagnostics::LisetteDiagnostic;
use syntax::ast::Expression;

use crate::store::Store;

const MUTATING_METHODS: &[&str] = &["Set", "Add", "Del"];

pub fn check_lost_query_mutation(
    expression: &Expression,
    store: &Store,
    diagnostics: &mut Vec<LisetteDiagnostic>,
) {
    let Expression::Call {
        expression: callee,
        span,
        ..
    } = expression
    else {
        return;
    };

    let Expression::DotAccess {
        expression: receiver,
        member,
        ..
    } = callee.unwrap_parens()
    else {
        return;
    };

    if !MUTATING_METHODS.contains(&member.as_str()) {
        return;
    }

    let Expression::Call {
        expression: query_callee,
        ..
    } = receiver.unwrap_parens()
    else {
        return;
    };

    let Expression::DotAccess {
        expression: url,
        member: query_member,
        ..
    } = query_callee.unwrap_parens()
    else {
        return;
    };

    if query_member != "Query" {
        return;
    }

    let receiver_ty = store.peel_alias(&url.get_type().strip_refs());
    if receiver_ty.strip_refs().get_qualified_id() != Some("go:net/url.URL") {
        return;
    }

    diagnostics.push(diagnostics::lint::lost_query_mutation(span, member));
}