Prefer adjacent string concatenation over using the `+` operator.

== Why is this an issue?

Given two string literals, Dart allows concatenation:

1. via the `+` operator over strings, e.g. `'Hello' + 'World'`
2. via adjacent string literals, e.g. `'Hello' 'World'` 

The `+` operator concatenates any two expressions of type `String`, irrespective of whether the two expressions are literals or not. This means that all the following expressions are valid:

* `'a literal' + 'another literal'`
* `'a literal' + aVariable`
* `aVariable + 'a literal'`

On the other hand, adjacent string literals are a specific form of concatenation that only works with string literals and interpolated strings, which means that only the first two of the following expressions are valid:

* `'a literal' 'another literal'`
* `'a literal' 'an interpolated ${"string"}'`
* `'a literal' aVariable`
* `aVariable 'a literal'`

Because concatenation of strings with variable elements should be done via https://dart.dev/language/built-in-types#strings[string interpolation] (as encouraged by S3512), consistently using adjacent string literals for concatenation of string without the variable elements (i.e. literals only) makes the code more readable and homogeneous, since a single syntax is used for all concatenations.

== How to fix it

Remove the `+` operator to have string literals adjacent to each other.

=== Code examples

==== Noncompliant code example

[source,dart,diff-id=1,diff-type=noncompliant]
----
String message = 'Hello' + 'World';	
----

==== Compliant solution

[source,dart,diff-id=1,diff-type=compliant]
----
String message = 'Hello' 'World';
----

== Resources

=== Documentation

* Dart Docs - https://dart.dev/tools/linter-rules/prefer_adjacent_string_concatenation[Dart Linter rule - prefer_adjacent_string_concatenation]
* Dart Docs - https://dart.dev/guides/language/language-tour#strings[Dart Language Tour - Strings]

=== Related rules

* S3512 - Interpolation should be used instead of String concatenation


ifdef::env-github,rspecator-view[]

'''
== Implementation Specification
(visible only on this page)

=== Message

* String literals shouldn't be concatenated by the '+' operator.

=== Highlighting

* The `+` operator in the string concatenation.

If a non-parenthesized sequence of concatenations is detected, a single issue is reported: e.g. in `'a' + 'b' + 'c'`, a single issue, on the first `+` operator, is reported.

In parenthesized expressions, only innermost concatenations are reported: e.g. in `'a' + ('b' + 'c')`, only the inner `+` operator is reported.

'''
== Comments And Links
(visible only on this page)

endif::env-github,rspecator-view[]
