Skip to content
This repository has been archived by the owner on Nov 5, 2022. It is now read-only.

Commit

Permalink
Update README.md
Browse files Browse the repository at this point in the history
  • Loading branch information
davidmorgan authored Jun 17, 2021
1 parent 66f2f6c commit 5dc836c
Showing 1 changed file with 12 additions and 291 deletions.
303 changes: 12 additions & 291 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,296 +1,17 @@
[![Pub](https://img.shields.io/pub/v/pedantic.svg)](https://pub.dev/packages/pedantic)

This package serves three purposes:
This package is deprecated.

- It documents how Dart static analysis is used internally at Google,
including best practices for the code we write. The documentation is
this `README.md`.
- It contains a corresponding sample `analysis_options.yaml`.
- It contains occasional small snippets of Dart code that are used in
implementing those best practices.
Before it was deprecated, it was the way to get analysis options
matching those used internally at Google. This was useful because
it was a good starting point for which lints to enable.

Most of the recommended lints directly implement the guidelines set out in
[Effective Dart](https://dart.dev/guides/language/effective-dart).
In a few cases the lints are stricter than the style guide for the sake of
consistency. Details [below](#stricter-than-effective-dart).
Instead, please see [package:lints](https://pub.dev/packages/lints) which
is the lint recommendation from the Dart team, or
[package:flutter_lints](https://pub.dev/packages/flutter_lints) which
extends that for Flutter. These are better than the Google lint set
because they take into account the needs of all Dart users, not just
Google engineers.

See
[this Medium article](https://medium.com/dartlang/pedantic-dart-1c7d365510de)
for more background.


## Using Static Analysis

Here is how static analysis is used internally at Google:

- By default we disallow checking in code with any errors, warnings, or hints.
- The `TODO` hint is a permanent exception.
- Deprecation hints are a permanent exception. Deprecations are handled
separately on a case by case basis.
- `unused_element`, `unused_field` and `unused_local_variable` are allowed.
- When a new SDK version adds new errors, warnings or hints, we either clean
up everything before switching SDK version or maintain a list of allowed
violations so it can be gradually cleaned up.
- Lints are considered and enabled on a case by case basis. When enabling a
lint we first clean up all pre-existing violations. After it's enabled, any
attempt to check in a further violation will be blocked.

## Enabled Lints

The currently enabled lints can be found in
[analysis_options.1.11.0.yaml](https://github.com/dart-lang/pedantic/blob/master/lib/analysis_options.1.11.0.yaml).

## Stricter than Effective Dart

Here are the important places where `pedantic` is stricter than Effective Dart:

`annotate_overrides` is stricter; Effective Dart says nothing about
`@override`.

`omit_local_variable_types` is stricter; Effective Dart only says to
[avoid](https://dart.dev/guides/language/effective-dart/design#avoid-type-annotating-initialized-local-variables)
type annotating initialized local variables.

`prefer_single_quotes` is stricter; Effective Dart says nothing about
single vs double quotes.

`use_function_type_syntax` is stricter; Effective Dart only says to
[consider](https://dart.dev/guides/language/effective-dart/design#consider-using-function-type-syntax-for-parameters)
using the new syntax.

## Using the Lints

To use the lints add a dependency in your `pubspec.yaml`:

```yaml
# If you use `package:pedantic/pedantic.dart`, add a normal dependency.
dependencies:
pedantic: ^1.11.0

# Or, if you just want `analysis_options.yaml`, it can be a dev dependency.
dev_dependencies:
pedantic: ^1.11.0
```
then, add an include in your `analysis_options.yaml`. If you want to always
use the latest version of the lints, add a dependency on the main
`analysis_options` file:


```yaml
include: package:pedantic/analysis_options.yaml
```

If your continuous build and/or presubmit check lints then they will likely
fail whenever a new version of `package:pedantic` is released. To avoid this,
specify a specific version of `analysis_options.yaml` instead:

```yaml
include: package:pedantic/analysis_options.1.11.0.yaml
```

## Unused Lints

The following lints have been considered and will _not_ be enforced:

`always_put_control_body_on_new_line`
violates Effective Dart "DO format your code using dartfmt". See note about
Flutter SDK style below.

`always_put_required_named_parameters_first`
does not allow for other logical orderings of parameters, such as matching the
class field order or alphabetical.

`always_specify_types`
violates Effective Dart "AVOID type annotating initialized local variables"
and others. See note about Flutter SDK style below.

`avoid_annotating_with_dynamic`
violates Effective Dart "PREFER annotating with `dynamic` instead of letting
inference fail".

`avoid_as`
does not reflect common usage. See note about Flutter SDK style below.

`avoid_catches_without_on_clauses`
is too strict, catching anything is useful and common even if not always the
most correct thing to do.

`avoid_catching_errors`
is too strict, the distinction between `Error` and `Exception` is followed
closely in the SDK but is impractical to follow everywhere.

`avoid_classes_with_only_static_members`
is too strict, Effective Dart explicitly calls out some cases (constants,
enum-like types) where it makes sense to violate this lint.

`avoid_double_and_int_checks`
only applies to web, but there is currently no mechanism for enabling a lint
on web code only.

`avoid_empty_else`
redundant when `curly_braces_in_control_structures` is also enabled.

`avoid_equals_and_hash_code_on_mutable_classes`
would require the `@immutable` annotation to be consistently and correctly
used everywhere.

`avoid_field_initializers_in_const_classes`
does not offer a clear readability benefit.

`avoid_js_rounded_ints`
only applies to web, but there is currently no mechanism for enabling a lint
on web code only.

`avoid_print`
is too strict, it's okay to `print` in some code.

`avoid_returning_null`
will be obsoleted by sound null safety.

`avoid_returning_this`
has occasional false positives, and adds little value as the cascade operator
for fluent interfaces in Dart is already very popular.

`avoid_slow_async_io`
gives wrong advice if the underlying filesystem has unusual properties, for
example a network mount.

`avoid_void_async`
prevents a valid style where an asynchronous method has a `void` return type
to indicate that nobody should `await` for the result.

`cancel_subscriptions`
has false positives when you use a utility method or class to call `cancel`.

`cascade_invocations`
does not reflect common usage.

`close_sinks`
has false positives when you use a utility method or class to call `close`.

`constant_identifier_names`
is too strict as it does not support the exceptions allowed in Effective Dart
for use of ALL_CAPS.

`control_flow_in_finally`
does not offer enough value: people are unlikely to do this by accident,
and there are occasional valid uses.

`directives_ordering`
would enforce a slightly different ordering to that used by IntelliJ and other
tools using the analyzer.

`diagnose_describe_all_properties`
requires too much maintenance for most codebases.

`empty_statements`
is superfluous, enforcing use of `dartfmt` is sufficient to make empty
statements obvious.

`flutter_style_todos`
is for Flutter SDK internal use, see note about Flutter SDK style below.

`invariant_booleans`
is experimental.

`join_return_with_assignment`
does not reflect common usage.

`literal_only_boolean_expressions`
does not offer enough value: such expressions are easily spotted and so hard
to add by accident.

`no_adjacent_strings_in_list`
does not offer enough value: adjacent strings in lists are easily spotted
when the code is formatted with `dartfmt`.

`one_member_abstracts`
is too strict, classes might implement more than one such abstract class and
there is no equivalent way to do this using functions.

`only_throw_errors`
does not reflect common usage.

`parameter_assignments`
does not reflect common usage, and will cause particular problems with null safe
code.

`prefer_asserts_in_initializer_lists`
does not reflect common usage.

`prefer_asserts_with_message`
is too strict; some asserts do not benefit from documentation.

`prefer_bool_in_asserts`
is obsolete in Dart 2; bool is required in asserts.

`prefer_const_constructors`
would add a lot of noise to code now that `new` is optional.

`prefer_const_constructors_in_immutables`
does not often apply as `@immutable` is not widely used.

`prefer_const_literals_to_create_immutables`
is too strict, requiring `const` everywhere adds noise.

`prefer_constructors_over_static_methods`
is too strict, in some cases static methods are better.

`prefer_double_quotes`
does not reflect common usage.

`prefer_expression_function_bodies`
is too strict, braces look better for long expressions.

`prefer_final_in_for_each`
does not reflect common usage.

`prefer_final_locals`
does not reflect common usage.

`prefer_foreach`
is too strict; `forEach` is not always an improvement.

`prefer_if_elements_to_conditional_expressions`
users prefer `?:` over `if`/`else`.

`prefer_int_literals`
does not reflect common usage.

`sort_constructors_first`
does not reflect common usage.

`sort_unnamed_constructors_first`
is too strict, people are free to choose the best constructor ordering.

`test_types_in_equals`
does not offer enough value: there are plenty of other mistakes possible in
`operator ==` implementations. It's better to use codegen.

`throw_in_finally`
does not offer enough value: people are unlikely to do this by accident,
and there are occasional valid uses.

`unnecessary_null_aware_assignments`
does not offer enough value: this is hard to do by mistake, and harmless.

`use_setters_to_change_properties`
is too strict: it can't detect when something is conceptually a property.

`use_string_buffers`
does not improve performance on web.

`use_to_and_as_if_applicable`
is too strict: it can't detect when the style rule actually applies.


Note on Flutter SDK Style: some lints were created specifically to support
Flutter SDK development. Flutter app developers should instead use standard
Dart style as described in Effective Dart, and should not use these lints.

## Features and bugs

Please file feature requests and bugs at the [issue tracker][tracker].

[tracker]: https://github.com/dart-lang/pedantic/issues
To migrate away from `package:pedantic` please see the instructions
[here](https://github.com/dart-lang/lints#migrating-from-packagepedantic).

0 comments on commit 5dc836c

Please sign in to comment.