| // 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/assist/assist_dart.dart'; |
| import 'package:analyzer/dart/analysis/results.dart'; |
| import 'package:analyzer/instrumentation/service.dart'; |
| import 'package:analyzer_plugin/utilities/assist/assist.dart'; |
| import 'package:analyzer_plugin/utilities/change_builder/change_workspace.dart'; |
| |
| /// The implementation of [DartAssistContext]. |
| class DartAssistContextImpl implements DartAssistContext { |
| @override |
| final InstrumentationService instrumentationService; |
| |
| @override |
| final ChangeWorkspace workspace; |
| |
| @override |
| final ResolvedUnitResult resolveResult; |
| |
| @override |
| final int selectionOffset; |
| |
| @override |
| final int selectionLength; |
| |
| DartAssistContextImpl(this.instrumentationService, this.workspace, |
| this.resolveResult, this.selectionOffset, this.selectionLength); |
| } |
| |
| /// An enumeration of possible assist kinds. |
| class DartAssistKind { |
| static const ADD_DIAGNOSTIC_PROPERTY_REFERENCE = AssistKind( |
| 'dart.assist.add.diagnosticPropertyReference', |
| 30, |
| 'Add a debug reference to this property'); |
| static const ADD_NOT_NULL_ASSERT = AssistKind( |
| 'dart.assist.add.notNullAssert', 30, 'Add a not-null assertion'); |
| static const ADD_RETURN_TYPE = |
| AssistKind('dart.assist.add.returnType', 30, 'Add return type'); |
| static const ADD_TYPE_ANNOTATION = |
| AssistKind('dart.assist.add.typeAnnotation', 30, 'Add type annotation'); |
| static const ASSIGN_TO_LOCAL_VARIABLE = AssistKind( |
| 'dart.assist.assignToVariable', 30, 'Assign value to new local variable'); |
| static const CONVERT_CLASS_TO_MIXIN = AssistKind( |
| 'dart.assist.convert.classToMixin', 30, 'Convert class to a mixin'); |
| static const CONVERT_DOCUMENTATION_INTO_BLOCK = AssistKind( |
| 'dart.assist.convert.blockComment', |
| 30, |
| 'Convert to block documentation comment'); |
| static const CONVERT_DOCUMENTATION_INTO_LINE = AssistKind( |
| 'dart.assist.convert.lineComment', |
| 30, |
| 'Convert to line documentation comment'); |
| static const CONVERT_INTO_ASYNC_BODY = AssistKind( |
| 'dart.assist.convert.bodyToAsync', 29, 'Convert to async function body'); |
| static const CONVERT_INTO_BLOCK_BODY = AssistKind( |
| 'dart.assist.convert.bodyToBlock', 30, 'Convert to block body'); |
| static const CONVERT_INTO_EXPRESSION_BODY = AssistKind( |
| 'dart.assist.convert.bodyToExpression', 30, 'Convert to expression body'); |
| static const CONVERT_INTO_FINAL_FIELD = AssistKind( |
| 'dart.assist.convert.getterToFinalField', 30, 'Convert to final field'); |
| static const CONVERT_INTO_FOR_INDEX = AssistKind( |
| 'dart.assist.convert.forEachToForIndex', 30, 'Convert to for-index loop'); |
| static const CONVERT_INTO_GENERIC_FUNCTION_SYNTAX = AssistKind( |
| 'dart.assist.convert.toGenericFunctionSyntax', |
| 30, |
| "Convert into 'Function' syntax"); |
| static const CONVERT_INTO_GETTER = AssistKind( |
| 'dart.assist.convert.finalFieldToGetter', 30, 'Convert to getter'); |
| static const CONVERT_INTO_IS_NOT = |
| AssistKind('dart.assist.convert.isNot', 30, 'Convert to is!'); |
| static const CONVERT_INTO_IS_NOT_EMPTY = AssistKind( |
| 'dart.assist.convert.isNotEmpty', 30, "Convert to 'isNotEmpty'", |
| // todo (pq): unify w/ fix |
| associatedErrorCodes: <String>['prefer_is_not_empty']); |
| static const CONVERT_PART_OF_TO_URI = AssistKind( |
| 'dart.assist.convert.partOfToPartUri', 30, 'Convert to use a URI'); |
| static const CONVERT_TO_DOUBLE_QUOTED_STRING = AssistKind( |
| 'dart.assist.convert.toDoubleQuotedString', |
| 30, |
| 'Convert to double quoted string'); |
| static const CONVERT_TO_FIELD_PARAMETER = AssistKind( |
| 'dart.assist.convert.toConstructorFieldParameter', |
| 30, |
| 'Convert to field formal parameter'); |
| static const CONVERT_TO_FOR_ELEMENT = AssistKind( |
| 'dart.assist.convert.toForElement', 30, "Convert to a 'for' element"); |
| static const CONVERT_TO_IF_ELEMENT = AssistKind( |
| 'dart.assist.convert.toIfElement', 30, "Convert to an 'if' element"); |
| static const CONVERT_TO_INT_LITERAL = AssistKind( |
| 'dart.assist.convert.toIntLiteral', 30, 'Convert to an int literal'); |
| static const CONVERT_TO_LIST_LITERAL = AssistKind( |
| 'dart.assist.convert.toListLiteral', 30, 'Convert to list literal', |
| associatedErrorCodes: <String>['prefer_collection_literals']); |
| static const CONVERT_TO_MAP_LITERAL = AssistKind( |
| 'dart.assist.convert.toMapLiteral', 30, 'Convert to map literal', |
| associatedErrorCodes: <String>['prefer_collection_literals']); |
| static const CONVERT_TO_MULTILINE_STRING = AssistKind( |
| 'dart.assist.convert.toMultilineString', |
| 30, |
| 'Convert to multiline string'); |
| static const CONVERT_TO_NORMAL_PARAMETER = AssistKind( |
| 'dart.assist.convert.toConstructorNormalParameter', |
| 30, |
| 'Convert to normal parameter'); |
| static const CONVERT_TO_NULL_AWARE = |
| AssistKind('dart.assist.convert.toNullAware', 30, "Convert to use '?.'"); |
| static const CONVERT_TO_PACKAGE_IMPORT = AssistKind( |
| 'dart.assist.convert.relativeToPackageImport', |
| 30, |
| "Convert to 'package:' import"); |
| static const CONVERT_TO_RELATIVE_IMPORT = AssistKind( |
| 'dart.assist.convert.packageToRelativeImport', |
| 30, |
| 'Convert to a relative import'); |
| static const CONVERT_TO_SET_LITERAL = AssistKind( |
| 'dart.assist.convert.toSetLiteral', 30, 'Convert to set literal', |
| associatedErrorCodes: <String>['prefer_collection_literals']); |
| static const CONVERT_TO_SINGLE_QUOTED_STRING = AssistKind( |
| 'dart.assist.convert.toSingleQuotedString', |
| 30, |
| 'Convert to single quoted string'); |
| static const CONVERT_TO_SPREAD = |
| AssistKind('dart.assist.convert.toSpread', 30, 'Convert to a spread'); |
| static const ENCAPSULATE_FIELD = |
| AssistKind('dart.assist.encapsulateField', 30, 'Encapsulate field'); |
| static const EXCHANGE_OPERANDS = |
| AssistKind('dart.assist.exchangeOperands', 30, 'Exchange operands'); |
| |
| // Flutter assists |
| static const FLUTTER_CONVERT_TO_CHILDREN = AssistKind( |
| 'dart.assist.flutter.convert.childToChildren', |
| 30, |
| 'Convert to children:'); |
| static const FLUTTER_CONVERT_TO_STATEFUL_WIDGET = AssistKind( |
| 'dart.assist.flutter.convert.toStatefulWidget', |
| 30, |
| 'Convert to StatefulWidget'); |
| |
| // Flutter wrap specific assists |
| static const FLUTTER_WRAP_GENERIC = |
| AssistKind('dart.assist.flutter.wrap.generic', 31, 'Wrap with widget...'); |
| |
| static const FLUTTER_WRAP_CENTER = |
| AssistKind('dart.assist.flutter.wrap.center', 32, 'Wrap with Center'); |
| static const FLUTTER_WRAP_COLUMN = |
| AssistKind('dart.assist.flutter.wrap.column', 32, 'Wrap with Column'); |
| static const FLUTTER_WRAP_CONTAINER = AssistKind( |
| 'dart.assist.flutter.wrap.container', 32, 'Wrap with Container'); |
| static const FLUTTER_WRAP_PADDING = |
| AssistKind('dart.assist.flutter.wrap.padding', 32, 'Wrap with Padding'); |
| static const FLUTTER_WRAP_ROW = |
| AssistKind('dart.assist.flutter.wrap.row', 32, 'Wrap with Row'); |
| static const FLUTTER_WRAP_SIZED_BOX = |
| AssistKind('dart.assist.flutter.wrap.sizedBox', 32, 'Wrap with SizedBox'); |
| static const FLUTTER_WRAP_STREAM_BUILDER = AssistKind( |
| 'dart.assist.flutter.wrap.streamBuilder', 32, 'Wrap with StreamBuilder'); |
| |
| // Flutter re-order assists |
| static const FLUTTER_SWAP_WITH_CHILD = |
| AssistKind('dart.assist.flutter.swap.withChild', 33, 'Swap with child'); |
| static const FLUTTER_SWAP_WITH_PARENT = |
| AssistKind('dart.assist.flutter.swap.withParent', 33, 'Swap with parent'); |
| static const FLUTTER_MOVE_DOWN = |
| AssistKind('dart.assist.flutter.move.down', 34, 'Move widget down'); |
| static const FLUTTER_MOVE_UP = |
| AssistKind('dart.assist.flutter.move.up', 34, 'Move widget up'); |
| |
| // Flutter remove assist |
| static const FLUTTER_REMOVE_WIDGET = |
| AssistKind('dart.assist.flutter.removeWidget', 35, 'Remove this widget'); |
| |
| static const IMPORT_ADD_SHOW = AssistKind( |
| 'dart.assist.add.showCombinator', 30, "Add explicit 'show' combinator"); |
| static const INLINE_INVOCATION = |
| AssistKind('dart.assist.inline', 30, "Inline invocation of '{0}'"); |
| static const INTRODUCE_LOCAL_CAST_TYPE = AssistKind( |
| 'dart.assist.introduceLocalCast', |
| 30, |
| 'Introduce new local with tested type'); |
| static const INVERT_IF_STATEMENT = |
| AssistKind('dart.assist.invertIf', 30, "Invert 'if' statement"); |
| static const JOIN_IF_WITH_INNER = AssistKind('dart.assist.joinWithInnerIf', |
| 30, "Join 'if' statement with inner 'if' statement"); |
| static const JOIN_IF_WITH_OUTER = AssistKind('dart.assist.joinWithOuterIf', |
| 30, "Join 'if' statement with outer 'if' statement"); |
| static const JOIN_VARIABLE_DECLARATION = AssistKind( |
| 'dart.assist.joinVariableDeclaration', 30, 'Join variable declaration'); |
| static const REMOVE_TYPE_ANNOTATION = AssistKind( |
| // todo (pq): unify w/ fix |
| 'dart.assist.remove.typeAnnotation', |
| 29, |
| 'Remove type annotation'); |
| static const REPLACE_CONDITIONAL_WITH_IF_ELSE = AssistKind( |
| 'dart.assist.convert.conditionalToIfElse', |
| 30, |
| "Replace conditional with 'if-else'"); |
| static const REPLACE_IF_ELSE_WITH_CONDITIONAL = AssistKind( |
| 'dart.assist.convert.ifElseToConditional', |
| 30, |
| "Replace 'if-else' with conditional ('c ? x : y')"); |
| static const REPLACE_WITH_VAR = AssistKind( |
| 'dart.assist.replace.withVar', 30, "Replace type annotation with 'var'"); |
| static const SHADOW_FIELD = AssistKind('dart.assist.shadowField', 30, |
| 'Create a local variable that shadows the field'); |
| static const SORT_CHILD_PROPERTY_LAST = AssistKind( |
| 'dart.assist.sort.child.properties.last', |
| 30, |
| 'Move child property to end of arguments'); |
| static const SPLIT_AND_CONDITION = |
| AssistKind('dart.assist.splitIfConjunction', 30, 'Split && condition'); |
| static const SPLIT_VARIABLE_DECLARATION = AssistKind( |
| 'dart.assist.splitVariableDeclaration', 30, 'Split variable declaration'); |
| static const SURROUND_WITH_BLOCK = |
| AssistKind('dart.assist.surround.block', 22, 'Surround with block'); |
| static const SURROUND_WITH_DO_WHILE = AssistKind( |
| 'dart.assist.surround.doWhile', 27, "Surround with 'do-while'"); |
| static const SURROUND_WITH_FOR = |
| AssistKind('dart.assist.surround.forEach', 26, "Surround with 'for'"); |
| static const SURROUND_WITH_FOR_IN = |
| AssistKind('dart.assist.surround.forIn', 25, "Surround with 'for-in'"); |
| static const SURROUND_WITH_IF = |
| AssistKind('dart.assist.surround.if', 23, "Surround with 'if'"); |
| static const SURROUND_WITH_SET_STATE = AssistKind( |
| 'dart.assist.surround.setState', 27, "Surround with 'setState'"); |
| static const SURROUND_WITH_TRY_CATCH = AssistKind( |
| 'dart.assist.surround.tryCatch', 28, "Surround with 'try-catch'"); |
| static const SURROUND_WITH_TRY_FINALLY = AssistKind( |
| 'dart.assist.surround.tryFinally', 29, "Surround with 'try-finally'"); |
| static const SURROUND_WITH_WHILE = |
| AssistKind('dart.assist.surround.while', 24, "Surround with 'while'"); |
| static const USE_CURLY_BRACES = |
| AssistKind('dart.assist.surround.curlyBraces', 30, 'Use curly braces'); |
| } |