Skip to content

bring the packages's lints in-line with the Flutter standard #4

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Aug 20, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
128 changes: 126 additions & 2 deletions analysis_options.yaml
Original file line number Diff line number Diff line change
@@ -1,19 +1,143 @@
# Specify analysis options.
#
# Until there are meta linter rules, each desired lint must be explicitly enabled.
# See: https://github.com/dart-lang/linter/issues/288
#
# For a list of lints, see: http://dart-lang.github.io/linter/lints/
# See the configuration guide for more
# https://github.com/dart-lang/sdk/tree/master/pkg/analyzer#configuring-the-analyzer
#
# This file contains the analysis options used by Flutter tools, such as IntelliJ,
# Android Studio, and the `flutter analyze` command.

analyzer:
language:
enableSuperMixins: true
strong-mode:
implicit-dynamic: false
errors:
unused_import: error
# treat missing required parameters as a warning (not a hint)
missing_required_param: warning
# treat missing returns as a warning (not a hint)
missing_return: warning

#TODO: Normalize this with /flutter/flutter/blob/master/analysis_options.yaml.
linter:
rules:
# these rules are documented on and in the same order as
# the Dart Lint rules page to make maintenance easier
# https://github.com/dart-lang/linter/blob/master/example/all.yaml
- always_declare_return_types
- always_put_control_body_on_new_line
# - always_put_required_named_parameters_first # we prefer having parameters in the same order as fields https://github.com/flutter/flutter/issues/10219
- always_require_non_null_named_parameters
- always_specify_types
- annotate_overrides
# - avoid_annotating_with_dynamic # conflicts with always_specify_types
- avoid_as
# - avoid_bool_literals_in_conditional_expressions # not yet tested
# - avoid_catches_without_on_clauses # we do this commonly
# - avoid_catching_errors # we do this commonly
- avoid_classes_with_only_static_members
# - avoid_double_and_int_checks # only useful when targeting JS runtime
- avoid_empty_else
- avoid_field_initializers_in_const_classes
- avoid_function_literals_in_foreach_calls
- avoid_init_to_null
# - avoid_js_rounded_ints # only useful when targeting JS runtime
- avoid_null_checks_in_equality_operators
# - avoid_positional_boolean_parameters # not yet tested
# - avoid_private_typedef_functions # we prefer having typedef (discussion in https://github.com/flutter/flutter/pull/16356)
- avoid_relative_lib_imports
- avoid_renaming_method_parameters
- avoid_return_types_on_setters
# - avoid_returning_null # we do this commonly
# - avoid_returning_this # https://github.com/dart-lang/linter/issues/842
# - avoid_setters_without_getters # not yet tested
# - avoid_single_cascade_in_expression_statements # not yet tested
- avoid_slow_async_io
# - avoid_types_as_parameter_names # https://github.com/dart-lang/linter/pull/954/files
# - avoid_types_on_closure_parameters # conflicts with always_specify_types
# - avoid_unused_constructor_parameters # https://github.com/dart-lang/linter/pull/847
- await_only_futures
- camel_case_types
- cancel_subscriptions
# - cascade_invocations # not yet tested
# - close_sinks # https://github.com/flutter/flutter/issues/5789
# - comment_references # blocked on https://github.com/dart-lang/dartdoc/issues/1153
# - constant_identifier_names # https://github.com/dart-lang/linter/issues/204
- control_flow_in_finally
- directives_ordering
- empty_catches
- empty_constructor_bodies
- empty_statements
- hash_and_equals
- implementation_imports
# - invariant_booleans # https://github.com/flutter/flutter/issues/5790
- iterable_contains_unrelated_type
# - join_return_with_assignment # not yet tested
- library_names
- library_prefixes
- list_remove_unrelated_type
# - literal_only_boolean_expressions # https://github.com/flutter/flutter/issues/5791
- no_adjacent_strings_in_list
- no_duplicate_case_values
- non_constant_identifier_names
# - omit_local_variable_types # opposite of always_specify_types
# - one_member_abstracts # too many false positives
# - only_throw_errors # https://github.com/flutter/flutter/issues/5792
- overridden_fields
- package_api_docs
- package_names
- package_prefixed_library_names
# - parameter_assignments # we do this commonly
- prefer_adjacent_string_concatenation
- prefer_asserts_in_initializer_lists
- prefer_bool_in_asserts
- prefer_collection_literals
- prefer_conditional_assignment
- prefer_const_constructors
- prefer_const_constructors_in_immutables
- prefer_const_declarations
- prefer_const_literals_to_create_immutables
# - prefer_constructors_over_static_methods # not yet tested
- prefer_contains
- prefer_equal_for_default_values
# - prefer_expression_function_bodies # conflicts with https://github.com/flutter/flutter/wiki/Style-guide-for-Flutter-repo#consider-using--for-short-functions-and-methods
- prefer_final_fields
- prefer_final_locals
- prefer_foreach
# - prefer_function_declarations_over_variables # not yet tested
- prefer_initializing_formals
# - prefer_interpolation_to_compose_strings # not yet tested
# - prefer_iterable_whereType # https://github.com/dart-lang/sdk/issues/32463
- prefer_is_empty
- prefer_is_not_empty
- prefer_single_quotes
- prefer_typing_uninitialized_variables
- recursive_getters
- slash_for_doc_comments
- sort_constructors_first
- sort_unnamed_constructors_first
- super_goes_last
- test_types_in_equals
- throw_in_finally
# - type_annotate_public_apis # subset of always_specify_types
- type_init_formals
# - unawaited_futures # https://github.com/flutter/flutter/issues/5793
- unnecessary_brace_in_string_interps
- unnecessary_const
- unnecessary_getters_setters
# - unnecessary_lambdas # https://github.com/dart-lang/linter/issues/498
- unnecessary_null_aware_assignments
- unnecessary_null_in_if_null_operators
- unnecessary_overrides
- unnecessary_parenthesis
- unnecessary_statements
- unnecessary_this
- unrelated_type_equality_checks
- use_rethrow_when_possible
# - use_setters_to_change_properties # not yet tested
# - use_string_buffers # https://github.com/dart-lang/linter/pull/664
# - use_to_and_as_if_applicable # has false positives, so we prefer to catch this by code-review
- valid_regexps
# - void_checks # not yet tested
12 changes: 7 additions & 5 deletions lib/charts/charts.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
// found in the LICENSE file.

import 'dart:async';
import 'dart:html' show Element, window, Rectangle;
import 'dart:html' show Element, window, Rectangle, Event;
import 'dart:math' as math;

import '../framework/framework.dart';
Expand All @@ -20,7 +20,7 @@ abstract class LineChart<T> {
LineChart(this.parent) {
parent.element.style.position = 'relative';

window.onResize.listen((e) => _updateSize());
window.onResize.listen((Event e) => _updateSize());
Timer.run(_updateSize);

chartElement = parent.add(div()
Expand All @@ -35,14 +35,16 @@ abstract class LineChart<T> {
}

void _updateSize() {
if (!isMounted) return;
if (!isMounted) {
return;
}

Rectangle rect = chartElement.element.getBoundingClientRect();
final Rectangle<num> rect = chartElement.element.getBoundingClientRect();
if (rect.width == 0 || rect.height == 0) {
return;
}

Element svgChild = chartElement.element.children.first;
final Element svgChild = chartElement.element.children.first;
svgChild.setAttribute('viewBox', '0 0 ${rect.width} ${rect.height}');
dim = new math.Point<int>(rect.width.toInt(), rect.height.toInt());

Expand Down
53 changes: 30 additions & 23 deletions lib/device/device.dart
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ class DeviceScreen extends Screen {
ExtensionTracker extensionTracker;

CoreElement togglesDiv;
Map<String, bool> boolValues = {};
Map<String, bool> boolValues = <String, bool>{};

DeviceScreen()
: super(
Expand All @@ -36,17 +36,17 @@ class DeviceScreen extends Screen {

@override
void createContent(Framework framework, CoreElement mainDiv) {
mainDiv.add([
mainDiv.add(<CoreElement>[
div(c: 'section')
..add([
..add(<CoreElement>[
form()
..layoutHorizontal()
..add([
..add(<CoreElement>[
div()..flex(),
])
]),
div(c: 'section')
..add([
..add(<CoreElement>[
div(text: 'Framework toggles', c: 'title'),
togglesDiv = div(),
])
Expand Down Expand Up @@ -79,10 +79,13 @@ class DeviceScreen extends Screen {
deviceStatus.element.text = '';
}

@override
HelpInfo get helpInfo => null;

void _rebuildTogglesDiv() {
if (togglesDiv == null || extensionTracker == null) return;
if (togglesDiv == null || extensionTracker == null) {
return;
}

togglesDiv.clear();

Expand All @@ -102,7 +105,7 @@ class DeviceScreen extends Screen {

togglesDiv.add(div(c: 'form-checkbox')
..add(new CoreElement('label')
..add([
..add(<CoreElement>[
input = new CoreElement('input')..setAttribute('type', 'checkbox'),
span(text: rpc),
])));
Expand All @@ -117,19 +120,21 @@ class DeviceScreen extends Screen {
}

input.element.onChange.listen((_) {
html.InputElement e = input.element;
final html.InputElement e = input.element;
boolValues[rpc] = e.checked;
extensionTracker.setBoolExtensionMethod(rpc, e.checked);
});
}
}

class ExtensionTracker {
final StreamController _changeController = new StreamController.broadcast();
final StreamController<Null> _changeController =
new StreamController<Null>.broadcast();

VmService service;

Map<String, Set<IsolateRef>> extensionToIsolatesMap = {};
Map<String, Set<IsolateRef>> extensionToIsolatesMap =
<String, Set<IsolateRef>>{};

ExtensionTracker(this.service) {
service.onIsolateEvent.listen((Event e) {
Expand All @@ -145,10 +150,10 @@ class ExtensionTracker {

bool get hasConnection => service != null;

Stream get onChange => _changeController.stream;
Stream<Null> get onChange => _changeController.stream;

bool get hasIsolateTargets {
for (Set set in extensionToIsolatesMap.values) {
for (Set<IsolateRef> set in extensionToIsolatesMap.values) {
if (set.isNotEmpty) {
return true;
}
Expand All @@ -162,13 +167,13 @@ class ExtensionTracker {
void stop() {}

void _register(IsolateRef isolateRef) {
service.getIsolate(isolateRef.id).then((result) {
service.getIsolate(isolateRef.id).then((dynamic result) {
if (result is Isolate) {
Isolate isolate = result;
final Isolate isolate = result;

for (String rpc in isolate.extensionRPCs) {
if (!extensionToIsolatesMap.containsKey(rpc)) {
extensionToIsolatesMap[rpc] = new Set();
extensionToIsolatesMap[rpc] = new Set<IsolateRef>();
}
extensionToIsolatesMap[rpc].add(isolateRef);
}
Expand All @@ -180,34 +185,36 @@ class ExtensionTracker {

void _registerRpcForIsolate(String rpc, IsolateRef isolateRef) {
if (!extensionToIsolatesMap.containsKey(rpc)) {
extensionToIsolatesMap[rpc] = new Set();
extensionToIsolatesMap[rpc] = new Set<IsolateRef>();
}
extensionToIsolatesMap[rpc].add(isolateRef);
}

void _removeIsolate(IsolateRef isolateRef) {
for (Set set in extensionToIsolatesMap.values) {
for (Set<IsolateRef> set in extensionToIsolatesMap.values) {
set.remove(isolateRef);
}
}

Future<bool> callBoolExtensionMethod(String rpc) {
IsolateRef isolateRef = extensionToIsolatesMap[rpc].first;
final IsolateRef isolateRef = extensionToIsolatesMap[rpc].first;
return service
.callServiceExtension(rpc, isolateId: isolateRef.id)
.then((Response response) {
return _convertToBool(response.json['enabled']);
});
}

Future setBoolExtensionMethod(String rpc, bool checked) {
IsolateRef isolateRef = extensionToIsolatesMap[rpc].first;
Future<Response> setBoolExtensionMethod(String rpc, bool checked) {
final IsolateRef isolateRef = extensionToIsolatesMap[rpc].first;
return service.callServiceExtension(rpc,
isolateId: isolateRef.id, args: {'enabled': checked});
isolateId: isolateRef.id, args: <String, bool>{'enabled': checked});
}

static bool _convertToBool(val) {
if (val is bool) return val;
static bool _convertToBool(dynamic val) {
if (val is bool) {
return val;
}
return val.toString() == 'true';
}
}
Loading