blob: 7bcca54d01793501577fbfedcf3ddf8501db6b03 [file] [log] [blame] [view]
---
title: Diagnostics
description: Details for diagnostics produced by the Dart analyzer.
---
{%- comment %}
WARNING: Do NOT EDIT this file directly. It is autogenerated by the script in
`pkg/analyzer/tool/diagnostics/generate.dart` in the sdk repository.
{% endcomment -%}
This page lists diagnostic messages produced by the Dart analyzer,
with details about what those messages mean and how you can fix your code.
For more information about the analyzer, see
[Customizing static analysis](/guides/language/analysis-options).
## Diagnostics
The analyzer produces the following diagnostics for code that
doesn't conform to the language specification or
that might work in unexpected ways.
### ambiguous_set_or_map_literal_both
_This literal contains both 'Map' and 'Iterable' spreads, which makes it
impossible to determine whether the literal is a map or a set._
#### Description
Because map and set literals use the same delimiters (`{` and `}`), the
analyzer looks at the type arguments and the elements to determine which
kind of literal you meant. When there are no type arguments and all of the
elements are spread elements (which are allowed in both kinds of literals),
then the analyzer uses the types of the expressions that are being spread.
If all of the expressions have the type `Iterable`, then it's a set
literal; if they all have the type `Map`, then it's a map literal.
The analyzer produces this diagnostic when some of the expressions being
spread have the type `Iterable` and others have the type `Map`, making it
impossible for the analyzer to determine whether you are writing a map
literal or a set literal.
#### Example
The following code produces this diagnostic:
```dart
union(Map<String, String> a, List<String> b, Map<String, String> c) =>
{...a, ...b, ...c};
```
The list `b` can only be spread into a set, and the maps `a` and `c` can
only be spread into a map, and the literal can't be both.
#### Common fixes
There are two common ways to fix this problem. The first is to remove all
of the spread elements of one kind or another, so that the elements are
consistent. In this case, that likely means removing the list and deciding
what to do about the now unused parameter:
```dart
union(Map<String, String> a, List<String> b, Map<String, String> c) =>
{...a, ...c};
```
The second fix is to change the elements of one kind into elements that are
consistent with the other elements. For example, you could add the elements
of the list as keys that map to themselves:
```dart
union(Map<String, String> a, List<String> b, Map<String, String> c) =>
{...a, for (String s in b) s: s, ...c};
```
### ambiguous_set_or_map_literal_either
_This literal must be either a map or a set, but the elements don't have enough
information for type inference to work._
#### Description
Because map and set literals use the same delimiters (`{` and `}`), the
analyzer looks at the type arguments and the elements to determine which
kind of literal you meant. When there are no type arguments and all of the
elements are spread elements (which are allowed in both kinds of literals)
then the analyzer uses the types of the expressions that are being spread.
If all of the expressions have the type `Iterable`, then it's a set
literal; if they all have the type `Map`, then it's a map literal.
This diagnostic is produced when none of the expressions being spread have
a type that allows the analyzer to decide whether you were writing a map
literal or a set literal.
#### Example
The following code produces this diagnostic:
```dart
union(a, b) => !{...a, ...b}!;
```
The problem occurs because there are no type arguments, and there is no
information about the type of either `a` or `b`.
#### Common fixes
There are three common ways to fix this problem. The first is to add type
arguments to the literal. For example, if the literal is intended to be a
map literal, you might write something like this:
```dart
union(a, b) => <String, String>{...a, ...b};
```
The second fix is to add type information so that the expressions have
either the type `Iterable` or the type `Map`. You could add an explicit
cast or, in this case, add types to the declarations of the two parameters:
```dart
union(List<int> a, List<int> b) => {...a, ...b};
```
The third fix is to add context information. In this case, that means
adding a return type to the function:
```dart
Set<String> union(a, b) => {...a, ...b};
```
In other cases, you might add a type somewhere else. For example, say the
original code looks like this:
```dart
union(a, b) {
var x = {...a, ...b};
return x;
}
```
You might add a type annotation on `x`, like this:
```dart
union(a, b) {
Map<String, String> x = {...a, ...b};
return x;
}
```
### deprecated_member_use
_'{0}' is deprecated and shouldn't be used._
#### Description
The analyzer produces this diagnostic when a deprecated library or class
member is used in a different package.
#### Example
If the method `m` in the class `C` is annotated with `@deprecated`, then
the following code produces this diagnostic:
```dart
void f(C c) {
c.!m!();
}
```
#### Common fixes
The documentation for declarations that are annotated with `@deprecated`
should indicate what code to use in place of the deprecated code.
### expression_in_map
_Expressions can't be used in a map literal._
#### Description
The analyzer produces this diagnostic when the analyzer finds an
expression, rather than a map entry, in what appears to be a map literal.
#### Example
The following code generates this diagnostic:
```dart
var map = <String, int>{'a': 0, 'b': 1, !'c'!};
```
#### Common fix
If the expression is intended to compute either a key or a value in an
entry, fix the issue by replacing the expression with the key or the value.
For example:
```dart
var map = <String, int>{'a': 0, 'b': 1, 'c': 2};
```
### invalid_literal_annotation
_Only const constructors can have the `@literal` annotation._
#### Description
The meaning of the `@literal` annotation is only defined when it's applied
to a const constructor.
#### Example
The following code produces this diagnostic:
```dart
!@literal!
var x;
```
#### Common fixes
Remove the annotation:
```dart
var x;
```
### not_iterable_spread
_Spread elements in list or set literals must implement 'Iterable'._
#### Description
The analyzer produces this diagnostic when the static type of the
expression of a spread element that appears in either a list literal or a
set literal doesn't implement the type `Iterable`.
#### Example
The following code generates this diagnostic:
```dart
var m = <String, int>{'a': 0, 'b': 1};
var s = <String>{...m};
```
#### Common fix
The most common fix is to replace the expression with one that produces an
iterable object:
```dart
var m = <String, int>{'a': 0, 'b': 1};
var s = <String>{...m.keys};
```
### sdk_version_set_literal
_Set literals weren't supported until version 2.2, but this code must be able to
run on earlier versions._
#### Description
The analyzer produces this diagnostic when a set literal is found in code
that has an SDK constraint whose lower bound is less than 2.2. Set literals
were not supported in earlier versions, so this code won't be able to run
against earlier versions of the SDK.
#### Example
In a package that defines the SDK constraint (in the pubspec.yaml file),
with a lower bound of less than 2.2. For example:
```yaml
environment:
sdk: '>=2.1.0 <2.4.0'
```
The following code generates this diagnostic:
```dart
var s = !<int>{}!;
```
#### Common fixes
If you don't need to support older versions of the SDK, then you can
increase the SDK constraint to allow the syntax to be used:
```yaml
environment:
sdk: '>=2.2.0 <2.4.0'
```
If you do need to support older versions of the SDK, then replace the set
literal with code that creates the set without the use of a literal:
```dart
var s = new Set<int>();
```