blob: bce5281096ec23bf8acb44b7bb3b324256fc1b78 [file] [log] [blame]
// Copyright (c) 2014, 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/plugin/edit/fix/fix_dart.dart';
import 'package:analysis_server/src/services/correction/fix/dart/top_level_declarations.dart';
import 'package:analysis_server/src/services/linter/lint_names.dart';
import 'package:analyzer/dart/analysis/results.dart';
import 'package:analyzer/error/error.dart';
import 'package:analyzer/instrumentation/service.dart';
import 'package:analyzer/src/error/codes.dart';
import 'package:analyzer/src/generated/parser.dart';
import 'package:analyzer_plugin/utilities/change_builder/change_workspace.dart';
import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
/// Return true if this [errorCode] is likely to have a fix associated with it.
bool hasFix(ErrorCode errorCode) =>
errorCode == CompileTimeErrorCode.CAST_TO_NON_TYPE ||
errorCode == CompileTimeErrorCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER ||
errorCode == CompileTimeErrorCode.ILLEGAL_ASYNC_RETURN_TYPE ||
errorCode == CompileTimeErrorCode.INSTANCE_ACCESS_TO_STATIC_MEMBER ||
errorCode == CompileTimeErrorCode.INVOCATION_OF_NON_FUNCTION ||
errorCode == CompileTimeErrorCode.NEW_WITH_UNDEFINED_CONSTRUCTOR ||
errorCode ==
CompileTimeErrorCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE ||
errorCode ==
CompileTimeErrorCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO ||
errorCode ==
CompileTimeErrorCode
.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE ||
errorCode ==
CompileTimeErrorCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR ||
errorCode ==
CompileTimeErrorCode
.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS ||
errorCode == CompileTimeErrorCode.NON_TYPE_AS_TYPE_ARGUMENT ||
errorCode == CompileTimeErrorCode.TYPE_TEST_WITH_UNDEFINED_NAME ||
errorCode == CompileTimeErrorCode.FINAL_NOT_INITIALIZED ||
errorCode == CompileTimeErrorCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_1 ||
errorCode == CompileTimeErrorCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_2 ||
errorCode ==
CompileTimeErrorCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_3_PLUS ||
errorCode == CompileTimeErrorCode.UNDEFINED_IDENTIFIER ||
errorCode ==
CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE ||
errorCode == CompileTimeErrorCode.INTEGER_LITERAL_IMPRECISE_AS_DOUBLE ||
errorCode == CompileTimeErrorCode.INVALID_ANNOTATION ||
errorCode == CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT ||
errorCode == CompileTimeErrorCode.PART_OF_NON_PART ||
errorCode == CompileTimeErrorCode.UNDEFINED_ANNOTATION ||
errorCode == CompileTimeErrorCode.UNDEFINED_CLASS_BOOLEAN ||
errorCode ==
CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT ||
errorCode == CompileTimeErrorCode.UNDEFINED_FUNCTION ||
errorCode == CompileTimeErrorCode.UNDEFINED_GETTER ||
errorCode == CompileTimeErrorCode.UNDEFINED_METHOD ||
errorCode == CompileTimeErrorCode.UNDEFINED_SETTER ||
errorCode == CompileTimeErrorCode.URI_DOES_NOT_EXIST ||
errorCode == CompileTimeErrorCode.URI_HAS_NOT_BEEN_GENERATED ||
errorCode == HintCode.CAN_BE_NULL_AFTER_NULL_AWARE ||
errorCode == HintCode.DEAD_CODE ||
errorCode == HintCode.DIVISION_OPTIMIZATION ||
errorCode == HintCode.TYPE_CHECK_IS_NOT_NULL ||
errorCode == HintCode.TYPE_CHECK_IS_NULL ||
errorCode == HintCode.UNNECESSARY_CAST ||
errorCode == HintCode.UNUSED_CATCH_CLAUSE ||
errorCode == HintCode.UNUSED_CATCH_STACK ||
errorCode == HintCode.UNUSED_IMPORT ||
errorCode == ParserErrorCode.EXPECTED_TOKEN ||
errorCode == ParserErrorCode.GETTER_WITH_PARAMETERS ||
errorCode == ParserErrorCode.VAR_AS_TYPE_NAME ||
errorCode == CompileTimeErrorCode.UNDEFINED_NAMED_PARAMETER ||
(errorCode is LintCode &&
(errorCode.name == LintNames.always_require_non_null_named_parameters ||
errorCode.name == LintNames.annotate_overrides ||
errorCode.name == LintNames.avoid_annotating_with_dynamic ||
errorCode.name == LintNames.avoid_empty_else ||
errorCode.name == LintNames.avoid_init_to_null ||
errorCode.name == LintNames.avoid_redundant_argument_values ||
errorCode.name == LintNames.avoid_return_types_on_setters ||
errorCode.name == LintNames.avoid_types_on_closure_parameters ||
errorCode.name == LintNames.await_only_futures ||
errorCode.name == LintNames.empty_catches ||
errorCode.name == LintNames.empty_constructor_bodies ||
errorCode.name == LintNames.empty_statements ||
errorCode.name == LintNames.no_duplicate_case_values ||
errorCode.name == LintNames.non_constant_identifier_names ||
errorCode.name == LintNames.null_closures ||
errorCode.name == LintNames.prefer_collection_literals ||
errorCode.name == LintNames.prefer_conditional_assignment ||
errorCode.name == LintNames.prefer_const_constructors ||
errorCode.name ==
LintNames.prefer_const_constructors_in_immutables ||
errorCode.name == LintNames.prefer_const_declarations ||
errorCode.name == LintNames.prefer_equal_for_default_values ||
errorCode.name == LintNames.prefer_final_fields ||
errorCode.name == LintNames.prefer_final_locals ||
errorCode.name == LintNames.prefer_is_not_empty ||
errorCode.name == LintNames.type_init_formals ||
errorCode.name == LintNames.unawaited_futures ||
errorCode.name == LintNames.unnecessary_brace_in_string_interps ||
errorCode.name == LintNames.unnecessary_const ||
errorCode.name == LintNames.unnecessary_lambdas ||
errorCode.name == LintNames.unnecessary_new ||
errorCode.name == LintNames.unnecessary_overrides ||
errorCode.name == LintNames.unnecessary_this ||
errorCode.name == LintNames.use_rethrow_when_possible));
/// An enumeration of quick fix kinds for the errors found in an analysis
/// options file.
class AnalysisOptionsFixKind {
static const REMOVE_LINT =
FixKind('analysisOptions.fix.removeLint', 50, "Remove '{0}'");
static const REMOVE_SETTING =
FixKind('analysisOptions.fix.removeSetting', 50, "Remove '{0}'");
}
/// The implementation of [DartFixContext].
class DartFixContextImpl implements DartFixContext {
@override
final InstrumentationService instrumentationService;
@override
final ChangeWorkspace workspace;
@override
final ResolvedUnitResult resolveResult;
@override
final AnalysisError error;
final List<TopLevelDeclaration> Function(String name)
getTopLevelDeclarationsFunction;
DartFixContextImpl(this.instrumentationService, this.workspace,
this.resolveResult, this.error, this.getTopLevelDeclarationsFunction);
@override
List<TopLevelDeclaration> getTopLevelDeclarations(String name) {
return getTopLevelDeclarationsFunction(name);
}
}
/// An enumeration of quick fix kinds found in a Dart file.
class DartFixKind {
static const ADD_ASYNC =
FixKind('dart.fix.add.async', 50, "Add 'async' modifier");
static const ADD_AWAIT =
FixKind('dart.fix.add.await', 50, "Add 'await' keyword");
static const ADD_EXPLICIT_CAST = FixKind(
'dart.fix.add.explicitCast', 50, 'Add cast',
appliedTogetherMessage: 'Add all casts in file');
static const ADD_CONST =
FixKind('dart.fix.add.const', 50, "Add 'const' modifier");
static const ADD_CURLY_BRACES =
FixKind('dart.fix.add.curlyBraces', 50, 'Add curly braces');
static const ADD_DIAGNOSTIC_PROPERTY_REFERENCE = FixKind(
'dart.fix.add.diagnosticPropertyReference',
50,
'Add a debug reference to this property');
static const ADD_FIELD_FORMAL_PARAMETERS = FixKind(
'dart.fix.add.fieldFormalParameters',
70,
'Add final field formal parameters');
static const ADD_LATE =
FixKind('dart.fix.add.late', 50, "Add 'late' modifier");
static const ADD_MISSING_ENUM_CASE_CLAUSES = FixKind(
'dart.fix.add.missingEnumCaseClauses', 50, 'Add missing case clauses');
static const ADD_MISSING_PARAMETER_NAMED = FixKind(
'dart.fix.add.missingParameterNamed', 70, "Add named parameter '{0}'");
static const ADD_MISSING_PARAMETER_POSITIONAL = FixKind(
'dart.fix.add.missingParameterPositional',
69,
'Add optional positional parameter');
static const ADD_MISSING_PARAMETER_REQUIRED = FixKind(
'dart.fix.add.missingParameterRequired',
70,
'Add required positional parameter');
static const ADD_MISSING_REQUIRED_ARGUMENT = FixKind(
'dart.fix.add.missingRequiredArgument',
70,
"Add required argument '{0}'");
static const ADD_NE_NULL = FixKind('dart.fix.add.neNull', 50, 'Add != null',
appliedTogetherMessage: 'Add != null everywhere in file');
static const ADD_NULL_CHECK =
FixKind('dart.fix.add.nullCheck', 50, 'Add a null check (!)');
static const ADD_OVERRIDE =
FixKind('dart.fix.add.override', 50, "Add '@override' annotation");
static const ADD_REQUIRED =
FixKind('dart.fix.add.required', 50, "Add '@required' annotation");
static const ADD_REQUIRED2 =
FixKind('dart.fix.add.required', 50, "Add 'required' keyword");
static const ADD_RETURN_TYPE =
FixKind('dart.fix.add.returnType', 50, 'Add return type');
static const ADD_STATIC =
FixKind('dart.fix.add.static', 50, "Add 'static' modifier");
static const ADD_SUPER_CONSTRUCTOR_INVOCATION = FixKind(
'dart.fix.add.superConstructorInvocation',
50,
'Add super constructor {0} invocation');
static const ADD_TYPE_ANNOTATION =
FixKind('dart.fix.add.typeAnnotation', 50, 'Add type annotation');
static const CHANGE_ARGUMENT_NAME =
FixKind('dart.fix.change.argumentName', 60, "Change to '{0}'");
static const CHANGE_TO = FixKind('dart.fix.change.to', 51, "Change to '{0}'");
static const CHANGE_TO_NEAREST_PRECISE_VALUE = FixKind(
'dart.fix.change.toNearestPreciseValue',
50,
'Change to nearest precise int-as-double value: {0}');
static const CHANGE_TO_STATIC_ACCESS = FixKind(
'dart.fix.change.toStaticAccess',
50,
"Change access to static using '{0}'");
static const CHANGE_TYPE_ANNOTATION = FixKind(
'dart.fix.change.typeAnnotation',
50,
"Change '{0}' to '{1}' type annotation");
static const CONVERT_FLUTTER_CHILD = FixKind(
'dart.fix.flutter.convert.childToChildren', 50, 'Convert to children:');
static const CONVERT_FLUTTER_CHILDREN = FixKind(
'dart.fix.flutter.convert.childrenToChild', 50, 'Convert to child:');
static const CONVERT_INTO_EXPRESSION_BODY = FixKind(
'dart.fix.convert.toExpressionBody', 50, 'Convert to expression body');
static const CONVERT_TO_CONTAINS =
FixKind('dart.fix.convert.toContains', 50, "Convert to using 'contains'");
static const CONVERT_TO_FOR_ELEMENT = FixKind(
'dart.fix.convert.toForElement', 50, "Convert to a 'for' element");
static const CONVERT_TO_GENERIC_FUNCTION_SYNTAX = FixKind(
'dart.fix.convert.toGenericFunctionSyntax',
50,
"Convert into 'Function' syntax");
static const CONVERT_TO_IF_ELEMENT =
FixKind('dart.fix.convert.toIfElement', 50, "Convert to an 'if' element");
static const CONVERT_TO_IF_NULL =
FixKind('dart.fix.convert.toIfNull', 50, "Convert to use '??'");
static const CONVERT_TO_INT_LITERAL =
FixKind('dart.fix.convert.toIntLiteral', 50, 'Convert to an int literal');
static const CONVERT_TO_LINE_COMMENT = FixKind(
'dart.fix.convert.toLineComment',
50,
'Convert to line documentation comment');
static const CONVERT_TO_LIST_LITERAL =
FixKind('dart.fix.convert.toListLiteral', 50, 'Convert to list literal');
static const CONVERT_TO_MAP_LITERAL =
FixKind('dart.fix.convert.toMapLiteral', 50, 'Convert to map literal');
static const CONVERT_TO_NAMED_ARGUMENTS = FixKind(
'dart.fix.convert.toNamedArguments', 50, 'Convert to named arguments');
static const CONVERT_TO_NULL_AWARE =
FixKind('dart.fix.convert.toNullAware', 50, "Convert to use '?.'");
static const CONVERT_TO_NULL_AWARE_SPREAD = FixKind(
'dart.fix.convert.toNullAwareSpread', 50, "Convert to use '...?'");
static const CONVERT_TO_ON_TYPE =
FixKind('dart.fix.convert.toOnType', 50, "Convert to 'on {0}'");
static const CONVERT_TO_PACKAGE_IMPORT = FixKind(
'dart.fix.convert.toPackageImport', 50, "Convert to 'package:' import");
static const CONVERT_TO_RELATIVE_IMPORT = FixKind(
'dart.fix.convert.toRelativeImport', 50, 'Convert to relative import');
static const CONVERT_TO_SET_LITERAL =
FixKind('dart.fix.convert.toSetLiteral', 50, 'Convert to set literal');
static const CONVERT_TO_SINGLE_QUOTED_STRING = FixKind(
'dart.fix.convert.toSingleQuotedString',
50,
'Convert to single quoted string');
static const CONVERT_TO_SPREAD =
FixKind('dart.fix.convert.toSpread', 50, 'Convert to a spread');
static const CONVERT_TO_WHERE_TYPE =
FixKind('dart.fix.convert.toWhereType', 50, "Convert to use 'whereType'");
static const CREATE_CLASS =
FixKind('dart.fix.create.class', 50, "Create class '{0}'");
static const CREATE_CONSTRUCTOR =
FixKind('dart.fix.create.constructor', 50, "Create constructor '{0}'");
static const CREATE_CONSTRUCTOR_FOR_FINAL_FIELDS = FixKind(
'dart.fix.create.constructorForFinalFields',
50,
'Create constructor for final fields');
static const CREATE_CONSTRUCTOR_SUPER = FixKind(
'dart.fix.create.constructorSuper', 50, 'Create constructor to call {0}');
static const CREATE_FIELD =
FixKind('dart.fix.create.field', 49, "Create field '{0}'");
static const CREATE_FILE =
FixKind('dart.fix.create.file', 50, "Create file '{0}'");
static const CREATE_FUNCTION =
FixKind('dart.fix.create.function', 49, "Create function '{0}'");
static const CREATE_GETTER =
FixKind('dart.fix.create.getter', 50, "Create getter '{0}'");
static const CREATE_LOCAL_VARIABLE = FixKind(
'dart.fix.create.localVariable', 50, "Create local variable '{0}'");
static const CREATE_METHOD =
FixKind('dart.fix.create.method', 50, "Create method '{0}'");
static const CREATE_MISSING_OVERRIDES = FixKind(
'dart.fix.create.missingOverrides', 51, 'Create {0} missing override(s)');
static const CREATE_MIXIN =
FixKind('dart.fix.create.mixin', 50, "Create mixin '{0}'");
static const CREATE_NO_SUCH_METHOD = FixKind(
'dart.fix.create.noSuchMethod', 49, "Create 'noSuchMethod' method");
static const CREATE_SETTER =
FixKind('dart.fix.create.setter', 50, "Create setter '{0}'");
static const DATA_DRIVEN = FixKind('dart.fix.dataDriven', 50, '{0}');
static const EXTEND_CLASS_FOR_MIXIN =
FixKind('dart.fix.extendClassForMixin', 50, "Extend the class '{0}'");
static const IMPORT_ASYNC =
FixKind('dart.fix.import.async', 49, "Import 'dart:async'");
static const IMPORT_LIBRARY_PREFIX = FixKind('dart.fix.import.libraryPrefix',
49, "Use imported library '{0}' with prefix '{1}'");
static const IMPORT_LIBRARY_PROJECT1 =
FixKind('dart.fix.import.libraryProject1', 53, "Import library '{0}'");
static const IMPORT_LIBRARY_PROJECT2 =
FixKind('dart.fix.import.libraryProject2', 52, "Import library '{0}'");
static const IMPORT_LIBRARY_PROJECT3 =
FixKind('dart.fix.import.libraryProject3', 51, "Import library '{0}'");
static const IMPORT_LIBRARY_SDK =
FixKind('dart.fix.import.librarySdk', 54, "Import library '{0}'");
static const IMPORT_LIBRARY_SHOW =
FixKind('dart.fix.import.libraryShow', 55, "Update library '{0}' import");
static const INLINE_INVOCATION =
FixKind('dart.fix.inlineInvocation', 30, "Inline invocation of '{0}'");
static const INLINE_TYPEDEF =
FixKind('dart.fix.inlineTypedef', 30, "Inline the definition of '{0}'");
static const INSERT_SEMICOLON =
FixKind('dart.fix.insertSemicolon', 50, "Insert ';'");
static const MAKE_CLASS_ABSTRACT =
FixKind('dart.fix.makeClassAbstract', 50, "Make class '{0}' abstract");
static const MAKE_FIELD_NOT_FINAL =
FixKind('dart.fix.makeFieldNotFinal', 50, "Make field '{0}' not final");
static const MAKE_FINAL = FixKind('dart.fix.makeFinal', 50, 'Make final');
static const MAKE_RETURN_TYPE_NULLABLE = FixKind(
'dart.fix.makeReturnTypeNullable', 50, 'Make the return type nullable');
static const MOVE_TYPE_ARGUMENTS_TO_CLASS = FixKind(
'dart.fix.moveTypeArgumentsToClass',
50,
'Move type arguments to after class name');
static const MAKE_VARIABLE_NOT_FINAL = FixKind(
'dart.fix.makeVariableNotFinal', 50, "Make variable '{0}' not final");
static const MAKE_VARIABLE_NULLABLE =
FixKind('dart.fix.makeVariableNullable', 50, "Make '{0}' nullable");
static const ORGANIZE_IMPORTS =
FixKind('dart.fix.organize.imports', 50, 'Organize Imports');
static const QUALIFY_REFERENCE =
FixKind('dart.fix.qualifyReference', 50, "Use '{0}'");
static const REMOVE_ANNOTATION =
FixKind('dart.fix.remove.annotation', 50, "Remove the '{0}' annotation");
static const REMOVE_ARGUMENT =
FixKind('dart.fix.remove.argument', 50, 'Remove argument');
static const REMOVE_AWAIT =
FixKind('dart.fix.remove.await', 50, 'Remove await');
static const REMOVE_COMPARISON =
FixKind('dart.fix.remove.comparison', 50, 'Remove comparison');
static const REMOVE_CONST =
FixKind('dart.fix.remove.const', 50, 'Remove const');
static const REMOVE_DEAD_CODE =
FixKind('dart.fix.remove.deadCode', 50, 'Remove dead code');
static const REMOVE_DUPLICATE_CASE = FixKind(
'dart.fix.remove.duplicateCase', 50, 'Remove duplicate case statement');
static const REMOVE_EMPTY_CATCH =
FixKind('dart.fix.remove.emptyCatch', 50, 'Remove empty catch clause');
static const REMOVE_EMPTY_CONSTRUCTOR_BODY = FixKind(
'dart.fix.remove.emptyConstructorBody',
50,
'Remove empty constructor body');
static const REMOVE_EMPTY_ELSE =
FixKind('dart.fix.remove.emptyElse', 50, 'Remove empty else clause');
static const REMOVE_EMPTY_STATEMENT =
FixKind('dart.fix.remove.emptyStatement', 50, 'Remove empty statement');
static const REMOVE_IF_NULL_OPERATOR =
FixKind('dart.fix.remove.ifNullOperator', 50, "Remove the '??' operator");
static const REMOVE_INITIALIZER =
FixKind('dart.fix.remove.initializer', 50, 'Remove initializer');
static const REMOVE_INTERPOLATION_BRACES = FixKind(
'dart.fix.remove.interpolationBraces',
50,
'Remove unnecessary interpolation braces');
static const REMOVE_METHOD_DECLARATION = FixKind(
'dart.fix.remove.methodDeclaration', 50, 'Remove method declaration');
static const REMOVE_NAME_FROM_COMBINATOR = FixKind(
'dart.fix.remove.nameFromCombinator', 50, "Remove name from '{0}'");
static const REMOVE_NON_NULL_ASSERTION =
FixKind('dart.fix.remove.nonNullAssertion', 50, "Remove the '!'");
static const REMOVE_OPERATOR =
FixKind('dart.fix.remove.operator', 50, 'Remove the operator');
static const REMOVE_PARAMETERS_IN_GETTER_DECLARATION = FixKind(
'dart.fix.remove.parametersInGetterDeclaration',
50,
'Remove parameters in getter declaration');
static const REMOVE_PARENTHESIS_IN_GETTER_INVOCATION = FixKind(
'dart.fix.remove.parenthesisInGetterInvocation',
50,
'Remove parentheses in getter invocation');
static const REMOVE_QUESTION_MARK =
FixKind('dart.fix.remove.questionMark', 50, "Remove the '?'");
static const REMOVE_THIS_EXPRESSION =
FixKind('dart.fix.remove.thisExpression', 50, 'Remove this expression');
static const REMOVE_TYPE_ANNOTATION =
FixKind('dart.fix.remove.typeAnnotation', 50, 'Remove type annotation');
static const REMOVE_TYPE_ARGUMENTS =
FixKind('dart.fix.remove.typeArguments', 49, 'Remove type arguments');
static const REMOVE_UNNECESSARY_CAST = FixKind(
'dart.fix.remove.unnecessaryCast', 50, 'Remove unnecessary cast',
appliedTogetherMessage: 'Remove all unnecessary casts in file');
static const REMOVE_UNNECESSARY_CONST = FixKind(
'dart.fix.remove.unnecessaryConst',
50,
'Remove unnecessary const keyword');
static const REMOVE_UNNECESSARY_NEW = FixKind(
'dart.fix.remove.unnecessaryNew', 50, 'Remove unnecessary new keyword');
static const REMOVE_UNNECESSARY_PARENTHESES = FixKind(
'dart.fix.remove.unnecessaryParentheses',
50,
'Remove unnecessary parentheses',
appliedTogetherMessage: 'Remove all unnecessary parentheses in file');
static const REMOVE_UNNECESSARY_STRING_INTERPOLATION = FixKind(
'dart.fix.remove.unnecessaryStringInterpolation',
50,
'Remove unnecessary string interpolation',
appliedTogetherMessage:
'Remove all unnecessary string interpolations in file');
static const REMOVE_UNUSED_CATCH_CLAUSE = FixKind(
'dart.fix.remove.unusedCatchClause', 50, "Remove unused 'catch' clause");
static const REMOVE_UNUSED_CATCH_STACK = FixKind(
'dart.fix.remove.unusedCatchStack',
50,
'Remove unused stack trace variable');
static const REMOVE_UNUSED_ELEMENT =
FixKind('dart.fix.remove.unusedElement', 50, 'Remove unused element');
static const REMOVE_UNUSED_FIELD =
FixKind('dart.fix.remove.unusedField', 50, 'Remove unused field');
static const REMOVE_UNUSED_IMPORT = FixKind(
'dart.fix.remove.unusedImport', 50, 'Remove unused import',
appliedTogetherMessage: 'Remove all unused imports in this file');
static const REMOVE_UNUSED_LABEL =
FixKind('dart.fix.remove.unusedLabel', 50, 'Remove unused label');
static const REMOVE_UNUSED_LOCAL_VARIABLE = FixKind(
'dart.fix.remove.unusedLocalVariable',
50,
'Remove unused local variable');
static const REMOVE_UNUSED_PARAMETER = FixKind(
'dart.fix.remove.unusedParameter', 50, 'Remove the unused parameter');
static const RENAME_TO_CAMEL_CASE =
FixKind('dart.fix.rename.toCamelCase', 50, "Rename to '{0}'");
static const REPLACE_BOOLEAN_WITH_BOOL = FixKind(
'dart.fix.replace.booleanWithBool', 50, "Replace 'boolean' with 'bool'",
appliedTogetherMessage: "Replace all 'boolean' with 'bool' in file");
static const REPLACE_CASCADE_WITH_DOT =
FixKind('dart.fix.replace.cascadeWithDot', 50, "Replace '..' with '.'");
static const REPLACE_COLON_WITH_EQUALS =
FixKind('dart.fix.replace.colonWithEquals', 50, "Replace ':' with '='");
static const REPLACE_WITH_FILLED = FixKind(
'dart.fix.replace.finalWithListFilled', 50, "Replace with 'List.filled'");
static const REPLACE_FINAL_WITH_CONST = FixKind(
'dart.fix.replace.finalWithConst', 50, "Replace 'final' with 'const'");
static const REPLACE_NEW_WITH_CONST = FixKind(
'dart.fix.replace.newWithConst', 50, "Replace 'new' with 'const'");
static const REPLACE_NULL_WITH_CLOSURE = FixKind(
'dart.fix.replace.nullWithClosure', 50, "Replace 'null' with a closure");
static const REPLACE_RETURN_TYPE_FUTURE = FixKind(
'dart.fix.replace.returnTypeFuture',
50,
"Return 'Future' from 'async' function");
static const REPLACE_VAR_WITH_DYNAMIC = FixKind(
'dart.fix.replace.varWithDynamic', 50, "Replace 'var' with 'dynamic'");
static const REPLACE_WITH_EIGHT_DIGIT_HEX =
FixKind('dart.fix.replace.withEightDigitHex', 50, "Replace with '{0}'");
static const REPLACE_WITH_BRACKETS =
FixKind('dart.fix.replace.withBrackets', 50, 'Replace with { }');
static const REPLACE_WITH_CONDITIONAL_ASSIGNMENT = FixKind(
'dart.fix.replace.withConditionalAssignment', 50, 'Replace with ??=');
static const REPLACE_WITH_EXTENSION_NAME =
FixKind('dart.fix.replace.withExtensionName', 50, "Replace with '{0}'");
static const REPLACE_WITH_IDENTIFIER =
FixKind('dart.fix.replace.withIdentifier', 50, 'Replace with identifier');
static const REPLACE_WITH_INTERPOLATION = FixKind(
'dart.fix.replace.withInterpolation', 50, 'Replace with interpolation');
static const REPLACE_WITH_IS_EMPTY =
FixKind('dart.fix.replace.withIsEmpty', 50, "Replace with 'isEmpty'");
static const REPLACE_WITH_IS_NOT_EMPTY = FixKind(
'dart.fix.replace.withIsNotEmpty', 50, "Replace with 'isNotEmpty'");
static const REPLACE_WITH_NOT_NULL_AWARE =
FixKind('dart.fix.replace.withNotNullAware', 50, "Replace with '{0}'");
static const REPLACE_WITH_NULL_AWARE = FixKind(
'dart.fix.replace.withNullAware',
50,
"Replace the '.' with a '?.' in the invocation");
static const REPLACE_WITH_TEAR_OFF = FixKind('dart.fix.replace.withTearOff',
50, 'Replace function literal with tear-off');
static const REPLACE_WITH_VAR = FixKind(
'dart.fix.replace.withVar', 50, "Replace type annotation with 'var'");
static const SORT_CHILD_PROPERTY_LAST = FixKind(
'dart.fix.sort.childPropertyLast',
50,
'Move child property to end of arguments');
static const UPDATE_SDK_CONSTRAINTS = FixKind(
'dart.fix.updateSdkConstraints', 50, 'Update the SDK constraints');
static const USE_CONST =
FixKind('dart.fix.use.const', 50, 'Change to constant');
static const USE_EFFECTIVE_INTEGER_DIVISION = FixKind(
'dart.fix.use.effectiveIntegerDivision',
50,
'Use effective integer division ~/');
static const USE_EQ_EQ_NULL = FixKind(
'dart.fix.use.eqEqNull', 50, "Use == null instead of 'is Null'",
appliedTogetherMessage:
"Use == null instead of 'is Null' everywhere in file");
static const USE_IS_NOT_EMPTY = FixKind('dart.fix.use.isNotEmpty', 50,
"Use x.isNotEmpty instead of '!x.isEmpty'");
static const USE_NOT_EQ_NULL = FixKind(
'dart.fix.use.notEqNull', 50, "Use != null instead of 'is! Null'",
appliedTogetherMessage:
"Use != null instead of 'is! Null' everywhere in file");
static const USE_RETHROW =
FixKind('dart.fix.use.rethrow', 50, 'Replace throw with rethrow');
static const WRAP_IN_FUTURE =
FixKind('dart.fix.wrap.future', 50, "Wrap in 'Future.value'");
static const WRAP_IN_TEXT =
FixKind('dart.fix.flutter.wrap.text', 50, "Wrap in a 'Text' widget");
}
/// An enumeration of quick fix kinds for the errors found in an Android
/// manifest file.
class ManifestFixKind {}
/// An enumeration of quick fix kinds for the errors found in a pubspec file.
class PubspecFixKind {}