Sakura Lang

W1003 unused_import

An imported name is never used in this module: not in a value, a type, a pattern or a @contract_test attribute.

A warning from the resolve phase. sakura explain W1003 prints this explanation offline.

An imported name is never used in this module: not in a value, a type, a pattern or a @contract_test attribute. The fix removes the name, or the whole import when nothing it brings is used, so sakura fix applies it (design §17.294 RQ-5).

Warning:

import std/json.{DecodeError, Json}
fn show(n: Int) -> String { Json.encode(n) }

Fixed:

import std/json.{Json}
fn show(n: Int) -> String { Json.encode(n) }

Wrong program

compiler/tests/ui/W1003_unused_import.sak, which the compiler's ui suite runs through sakura check:

// §17.294 RQ-5: one W1003 per unused imported name. `Json`, the last of its list, goes with the
// comma before it and `Level`, the first, with the comma after it; the `import`s of `retry`,
// `crypto` and `Violation` go whole. A name used in a value (`None`), only in a type
// (`DecodeError`), only in a pattern (`Some`) or only in a `@contract_test` attribute (`Log`)
// is used.
import std/core.{Violation}
import std/crypto
import std/json.{DecodeError, Json}
import std/log.{Level, Log}
import std/option.{None, Some}
import std/retry.{retry}

@contract_test(handlers: [Log.captured()])
pub fn show(n: Int) -> String
  requires n > 0
{ "{n}" }

pub fn same(e: DecodeError) -> DecodeError { e }

pub fn is_some(o: Option<Int>) -> Bool {
  match o {
    Some(_) => true,
    _ => false,
  }
}

pub fn nothing() -> Option<Int> { None }

sakura check --json reports this record (pretty-printed; $DIR is the fixture's directory):

{
  "schema_version": "1.0",
  "kind": "diagnostic",
  "id": "d:68b46a6d7cb813e4",
  "code": "W1003",
  "severity": "warning",
  "phase": "resolve",
  "message": "`Violation` is imported but never used",
  "snapshot": "sha256:$SNAPSHOT",
  "symbol_id": null,
  "spans": [
    {
      "uri": "file://$DIR/W1003_unused_import.sak",
      "content_hash": "sha256:7cc3be26d97189e06f6d3c7ab675b81c0aae6d3882a6186b4c7277f555044e0f",
      "start_byte": 460,
      "end_byte": 469,
      "role": "primary"
    }
  ],
  "related_ids": [],
  "expected": null,
  "actual": null,
  "obligation": null,
  "counterexample": null,
  "explanation_uri": "sakura://explain/W1003",
  "fixes": [
    {
      "id": "f:68b46a6d7cb813e4.0",
      "title": "Remove the import",
      "applicability": "machine_applicable",
      "impact": "local",
      "edits": [
        {
          "span": {
            "uri": "file://$DIR/W1003_unused_import.sak",
            "content_hash": "sha256:7cc3be26d97189e06f6d3c7ab675b81c0aae6d3882a6186b4c7277f555044e0f",
            "start_byte": 443,
            "end_byte": 471,
            "role": "primary"
          },
          "replacement": ""
        }
      ]
    }
  ]
}

Fixed program

compiler/tests/ui/W1003_unused_import.fixed.sak, which sakura check accepts with no diagnostics:

import std/json.{DecodeError}
import std/log.{Log}
import std/option.{None, Some}

@contract_test(handlers: [Log.captured()])
pub fn show(n: Int) -> String
  requires n > 0
{ "{n}" }

pub fn same(e: DecodeError) -> DecodeError { e }

pub fn is_some(o: Option<Int>) -> Bool {
  match o {
    Some(_) => true,
    _ => false,
  }
}

pub fn nothing() -> Option<Int> { None }
Edit on GitHub

Last updated

On this page