Skip to content

Commit

Permalink
fix for prefer_int_literals
Browse files Browse the repository at this point in the history
Change-Id: I4743fdce6e638e20e641d764b7e1dd607419dcd3
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/116260
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Phil Quitslund <pquitslund@google.com>
  • Loading branch information
pq authored and commit-bot@chromium.org committed Sep 9, 2019
1 parent 41c5b81 commit ab5e36b
Show file tree
Hide file tree
Showing 9 changed files with 101 additions and 47 deletions.
32 changes: 9 additions & 23 deletions pkg/analysis_server/lib/src/services/correction/assist.dart
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,7 @@ class DartAssistContextImpl implements DartAssistContext {
*/
class DartAssistKind {
static const ADD_TYPE_ANNOTATION = const AssistKind(
'dart.assist.addTypeAnnotation', 30, "Add type annotation",
associatedErrorCodes: <String>[
'always_specify_types',
'type_annotate_public_apis'
]);
'dart.assist.addTypeAnnotation', 30, "Add type annotation");
static const ASSIGN_TO_LOCAL_VARIABLE = const AssistKind(
'dart.assist.assignToVariable', 30, "Assign value to new local variable");
static const CONVERT_CLASS_TO_MIXIN = const AssistKind(
Expand All @@ -48,17 +44,18 @@ class DartAssistKind {
static const CONVERT_DOCUMENTATION_INTO_LINE = const AssistKind(
'dart.assist.convert.lineComment',
30,
"Convert to line documentation comment",
associatedErrorCodes: <String>['slash_for_doc_comments']);
"Convert to line documentation comment");
static const CONVERT_INTO_ASYNC_BODY = const AssistKind(
'dart.assist.convert.bodyToAsync', 29, "Convert to async function body");
static const CONVERT_INTO_BLOCK_BODY = const AssistKind(
'dart.assist.convert.bodyToBlock', 30, "Convert to block body");
static const CONVERT_INTO_EXPRESSION_BODY = const AssistKind(
'dart.assist.convert.bodyToExpression', 30, "Convert to expression body",
// todo (pq): migrate to (conditional) fix
associatedErrorCodes: <String>['prefer_expression_function_bodies']);
static const CONVERT_INTO_FINAL_FIELD = const AssistKind(
'dart.assist.convert.getterToFinalField', 30, "Convert to final field",
// todo (pq): migrate to (conditional) fix
associatedErrorCodes: <String>['prefer_final_fields']);
static const CONVERT_INTO_FOR_INDEX = const AssistKind(
'dart.assist.convert.forEachToForIndex', 30, "Convert to for-index loop");
Expand All @@ -85,19 +82,11 @@ class DartAssistKind {
30,
"Convert to field formal parameter");
static const CONVERT_TO_FOR_ELEMENT = const AssistKind(
'dart.assist.convertToForElement', 30, "Convert to a 'for' element",
associatedErrorCodes: <String>[
'prefer_for_elements_to_map_fromIterable'
]);
'dart.assist.convertToForElement', 30, "Convert to a 'for' element");
static const CONVERT_TO_IF_ELEMENT = const AssistKind(
'dart.assist.convertToIfElement', 30, "Convert to an 'if' element",
associatedErrorCodes: <String>[
'prefer_if_elements_to_conditional_expressions'
]);
'dart.assist.convertToIfElement', 30, "Convert to an 'if' element");
static const CONVERT_TO_INT_LITERAL = const AssistKind(
'dart.assist.convert.toIntLiteral', 30, "Convert to an int literal",
// todo (pq): migrate to (conditional) fix
associatedErrorCodes: <String>['prefer_int_literals']);
'dart.assist.convert.toIntLiteral', 30, "Convert to an int literal");
static const CONVERT_TO_LIST_LITERAL = const AssistKind(
'dart.assist.convert.toListLiteral', 30, "Convert to list literal",
// todo (brianwilkerson): unify w/ fix
Expand Down Expand Up @@ -241,9 +230,6 @@ class DartAssistKind {
'dart.assist.surround.tryFinally', 29, "Surround with 'try-finally'");
static const SURROUND_WITH_WHILE = const AssistKind(
'dart.assist.surround.while', 24, "Surround with 'while'");
static const USE_CURLY_BRACES = const AssistKind(
'USE_CURLY_BRACES', 30, "Use curly braces",
associatedErrorCodes: <String>[
'curly_braces_in_flow_control_structures',
]);
static const USE_CURLY_BRACES =
const AssistKind('USE_CURLY_BRACES', 30, "Use curly braces");
}
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,11 @@ class AssistProcessor extends BaseProcessor {
await _addProposal_convertToFieldParameter();
await _addProposal_convertToForIndexLoop();
await _addProposal_convertToGenericFunctionSyntax();
await _addProposal_convertToIntLiteral();
if (!_containsErrorCode(
{LintNames.prefer_int_literals},
)) {
await _addProposal_convertToIntLiteral();
}
await _addProposal_convertToIsNot_onIs();
await _addProposal_convertToIsNot_onNot();
await _addProposal_convertToIsNotEmpty();
Expand Down Expand Up @@ -1133,29 +1137,7 @@ class AssistProcessor extends BaseProcessor {
}

Future<void> _addProposal_convertToIntLiteral() async {
if (node is! DoubleLiteral) {
_coverageMarker();
return;
}
DoubleLiteral literal = node;
int intValue;
try {
intValue = literal.value?.truncate();
} catch (e) {
// Double cannot be converted to int
}
if (intValue == null || intValue != literal.value) {
_coverageMarker();
return;
}

var changeBuilder = _newDartChangeBuilder();
await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
builder.addReplacement(new SourceRange(literal.offset, literal.length),
(DartEditBuilder builder) {
builder.write('$intValue');
});
});
final changeBuilder = await createBuilder_convertToIntLiteral();
_addAssistFromBuilder(changeBuilder, DartAssistKind.CONVERT_TO_INT_LITERAL);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import 'package:analyzer/dart/ast/token.dart';
import 'package:analyzer/dart/ast/visitor.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/dart/element/type.dart';
import 'package:analyzer/source/source_range.dart';
import 'package:analyzer/src/dart/analysis/experiments.dart';
import 'package:analyzer/src/dart/analysis/session_helper.dart';
import 'package:analyzer/src/dart/ast/utilities.dart';
Expand Down Expand Up @@ -472,6 +473,33 @@ abstract class BaseProcessor {
return changeBuilder;
}

Future<ChangeBuilder> createBuilder_convertToIntLiteral() async {
if (node is! DoubleLiteral) {
_coverageMarker();
return null;
}
DoubleLiteral literal = node;
int intValue;
try {
intValue = literal.value?.truncate();
} catch (e) {
// Double cannot be converted to int
}
if (intValue == null || intValue != literal.value) {
_coverageMarker();
return null;
}

var changeBuilder = _newDartChangeBuilder();
await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
builder.addReplacement(new SourceRange(literal.offset, literal.length),
(DartEditBuilder builder) {
builder.write('$intValue');
});
});
return changeBuilder;
}

@protected
Future<ChangeBuilder> createBuilder_useCurlyBraces() async {
Future<ChangeBuilder> doStatement(DoStatement node) async {
Expand Down
2 changes: 2 additions & 0 deletions pkg/analysis_server/lib/src/services/correction/fix.dart
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,8 @@ class DartFixKind {
const FixKind('CONVERT_TO_FOR_ELEMENT', 50, "Convert to a 'for' element");
static const CONVERT_TO_IF_ELEMENT =
const FixKind('CONVERT_TO_IF_ELEMENT', 50, "Convert to an 'if' element");
static const CONVERT_TO_INT_LITERAL =
const FixKind('CONVERT_TO_INT_LITERAL', 50, "Convert to an int literal");
static const CONVERT_TO_LINE_COMMENT = const FixKind(
'CONVERT_TO_LINE_COMMENT', 50, "Convert to line documentation comment");
static const CONVERT_TO_NAMED_ARGUMENTS = const FixKind(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -637,6 +637,9 @@ class FixProcessor extends BaseProcessor {
LintNames.prefer_if_elements_to_conditional_expressions) {
await _addFix_convertConditionalToIfElement();
}
if (name == LintNames.prefer_int_literals) {
await _addFix_convertToIntLiteral();
}
if (name == LintNames.prefer_is_empty) {
await _addFix_replaceWithIsEmpty();
}
Expand Down Expand Up @@ -1354,6 +1357,11 @@ class FixProcessor extends BaseProcessor {
_addFixFromBuilder(changeBuilder, DartFixKind.CONVERT_TO_FOR_ELEMENT);
}

Future<void> _addFix_convertToIntLiteral() async {
final changeBuilder = await createBuilder_convertToIntLiteral();
_addFixFromBuilder(changeBuilder, DartFixKind.CONVERT_TO_INT_LITERAL);
}

Future<void> _addFix_convertToNamedArgument() async {
var argumentList = this.node;
if (argumentList is ArgumentList) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ class LintNames {
static const String prefer_final_locals = 'prefer_final_locals';
static const String prefer_for_elements_to_map_fromIterable =
'prefer_for_elements_to_map_fromIterable';
static const String prefer_int_literals = 'prefer_int_literals';
static const String prefer_if_elements_to_conditional_expressions =
'prefer_if_elements_to_conditional_expressions';
static const String prefer_is_empty = 'prefer_is_empty';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
// BSD-style license that can be found in the LICENSE file.

import 'package:analysis_server/src/services/correction/assist.dart';
import 'package:analysis_server/src/services/linter/lint_names.dart';
import 'package:analyzer_plugin/utilities/assist/assist.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';

Expand All @@ -28,6 +29,15 @@ const double myDouble = 42;
''');
}

test_decimal_noAssistWithLint() async {
createAnalysisOptionsFile(lints: [LintNames.prefer_int_literals]);
verifyNoTestUnitErrors = false;
await resolveTestUnit('''
const double myDouble = /*caret*/42.0;
''');
await assertNoAssist();
}

test_notDouble() async {
await resolveTestUnit('''
const double myDouble = /*caret*/42;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

import 'package:analysis_server/src/services/correction/fix.dart';
import 'package:analysis_server/src/services/linter/lint_names.dart';
import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';

import 'fix_processor.dart';

main() {
defineReflectiveSuite(() {
defineReflectiveTests(ConvertToIntLiteralTest);
});
}

@reflectiveTest
class ConvertToIntLiteralTest extends FixProcessorLintTest {
@override
FixKind get kind => DartFixKind.CONVERT_TO_INT_LITERAL;

@override
String get lintCode => LintNames.prefer_int_literals;

/// More coverage in the `convert_to_int_literal_test.dart` assist test.
test_decimal() async {
await resolveTestUnit('''
const double myDouble = /*LINT*/42.0;
''');
await assertHasFix('''
const double myDouble = /*LINT*/42;
''');
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ import 'convert_flutter_child_test.dart' as convert_flutter_child;
import 'convert_flutter_children_test.dart' as convert_flutter_children;
import 'convert_to_for_element_test.dart' as convert_to_for_element;
import 'convert_to_if_element_test.dart' as convert_to_if_element;
import 'convert_to_int_literal_test.dart' as convert_to_int_literal;
import 'convert_to_named_arguments_test.dart' as convert_to_named_arguments;
import 'create_class_test.dart' as create_class;
import 'create_constructor_for_final_fields_test.dart'
Expand Down Expand Up @@ -149,6 +150,7 @@ main() {
convert_flutter_children.main();
convert_to_for_element.main();
convert_to_if_element.main();
convert_to_int_literal.main();
convert_to_named_arguments.main();
create_class.main();
create_constructor_for_final_field.main();
Expand Down

0 comments on commit ab5e36b

Please sign in to comment.