# `Mix.Task.Compiler.Diagnostic`
[🔗](https://github.com/elixir-lang/elixir/blob/7ff272706afc522e74121493b7166719985cb099/lib/mix/lib/mix/task.compiler.ex#L96)

Diagnostic information such as a warning or compilation error.

The file and position relate to where the diagnostic should be shown.
If there is a file and position, then the diagnostic is precise
and you can use the given file and position for generating snippets,
IDEs annotations, and so on. An optional span is available with
the line and column the diagnostic ends.

Otherwise, a stacktrace may be given, which you can place your own
heuristics to provide better reporting.

The source field points to the source file the compiler tracked
the error to. For example, a file `lib/foo.ex` may embed `.eex`
templates from `lib/foo/bar.eex`. A syntax error on the EEx template
will point to file `lib/foo/bar.eex` but the source is `lib/foo.ex`.

# `severity`

```elixir
@type severity() :: :error | :warning | :information | :hint
```

Severity of a diagnostic:

  * `:error` - An issue that caused compilation to fail

  * `:warning` - An issue that did not cause failure but suggests the
    programmer may have made a mistake

  * `:hint` - A suggestion for style or good practices that is not as
    severe as a warning

  * `:information` - Any other information relevant to compilation that
    does not fit into the above categories

# `t`

```elixir
@type t() :: %Mix.Task.Compiler.Diagnostic{
  compiler_name: String.t(),
  details: term(),
  file: Path.t() | nil,
  message: IO.chardata(),
  position: Code.position(),
  severity: severity(),
  source: Path.t() | nil,
  span: {line :: pos_integer(), column :: pos_integer()} | nil,
  stacktrace: Exception.stacktrace()
}
```

---

*Consult [api-reference.md](api-reference.md) for complete listing*
