| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library analysis_server.src.services.correction.fix; | 5 library analysis_server.src.services.correction.fix; |
| 6 | 6 |
| 7 import 'package:analysis_server/edit/fix/fix_core.dart'; | 7 import 'package:analysis_server/edit/fix/fix_core.dart'; |
| 8 import 'package:analysis_server/src/plugin/server_plugin.dart'; | 8 import 'package:analysis_server/src/plugin/server_plugin.dart'; |
| 9 import 'package:analyzer/file_system/file_system.dart'; | 9 import 'package:analyzer/file_system/file_system.dart'; |
| 10 import 'package:analyzer/src/generated/engine.dart'; | 10 import 'package:analyzer/src/generated/engine.dart'; |
| 11 import 'package:analyzer/src/generated/error.dart'; | 11 import 'package:analyzer/src/generated/error.dart'; |
| 12 import 'package:analyzer/src/generated/java_engine.dart'; | 12 import 'package:analyzer/src/generated/java_engine.dart'; |
| 13 import 'package:analyzer/src/generated/parser.dart'; |
| 13 | 14 |
| 14 /** | 15 /** |
| 15 * Compute and return the fixes available for the given [error]. The error was | 16 * Compute and return the fixes available for the given [error]. The error was |
| 16 * reported after it's source was analyzed in the given [context]. The [plugin] | 17 * reported after it's source was analyzed in the given [context]. The [plugin] |
| 17 * is used to get the list of fix contributors. | 18 * is used to get the list of fix contributors. |
| 18 */ | 19 */ |
| 19 List<Fix> computeFixes(ServerPlugin plugin, ResourceProvider resourceProvider, | 20 List<Fix> computeFixes(ServerPlugin plugin, ResourceProvider resourceProvider, |
| 20 AnalysisContext context, AnalysisError error) { | 21 AnalysisContext context, AnalysisError error) { |
| 21 List<Fix> fixes = <Fix>[]; | 22 List<Fix> fixes = <Fix>[]; |
| 22 List<FixContributor> contributors = plugin.fixContributors; | 23 List<FixContributor> contributors = plugin.fixContributors; |
| 23 for (FixContributor contributor in contributors) { | 24 for (FixContributor contributor in contributors) { |
| 24 try { | 25 try { |
| 25 List<Fix> contributedFixes = | 26 List<Fix> contributedFixes = |
| 26 contributor.computeFixes(resourceProvider, context, error); | 27 contributor.computeFixes(resourceProvider, context, error); |
| 27 if (contributedFixes != null) { | 28 if (contributedFixes != null) { |
| 28 fixes.addAll(contributedFixes); | 29 fixes.addAll(contributedFixes); |
| 29 } | 30 } |
| 30 } catch (exception, stackTrace) { | 31 } catch (exception, stackTrace) { |
| 31 AnalysisEngine.instance.logger.logError( | 32 AnalysisEngine.instance.logger.logError( |
| 32 'Exception from fix contributor: ${contributor.runtimeType}', | 33 'Exception from fix contributor: ${contributor.runtimeType}', |
| 33 new CaughtException(exception, stackTrace)); | 34 new CaughtException(exception, stackTrace)); |
| 34 } | 35 } |
| 35 } | 36 } |
| 36 fixes.sort(Fix.SORT_BY_RELEVANCE); | 37 fixes.sort(Fix.SORT_BY_RELEVANCE); |
| 37 return fixes; | 38 return fixes; |
| 38 } | 39 } |
| 39 | 40 |
| 40 /** | 41 /** |
| 42 * Return true if this [errorCode] is likely to have a fix associated with it. |
| 43 */ |
| 44 bool hasFix(ErrorCode errorCode) { |
| 45 switch (errorCode) { |
| 46 case StaticWarningCode.UNDEFINED_CLASS_BOOLEAN: |
| 47 case StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER: |
| 48 case StaticWarningCode.EXTRA_POSITIONAL_ARGUMENTS: |
| 49 case StaticWarningCode.NEW_WITH_UNDEFINED_CONSTRUCTOR: |
| 50 case StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE: |
| 51 case StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO: |
| 52 case StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE: |
| 53 case StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR: |
| 54 case StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS
: |
| 55 case StaticWarningCode.CAST_TO_NON_TYPE: |
| 56 case StaticWarningCode.TYPE_TEST_WITH_UNDEFINED_NAME: |
| 57 case StaticWarningCode.UNDEFINED_CLASS: |
| 58 case StaticWarningCode.FINAL_NOT_INITIALIZED: |
| 59 case StaticWarningCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_1: |
| 60 case StaticWarningCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_2: |
| 61 case StaticWarningCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_3_PLUS: |
| 62 case StaticWarningCode.UNDEFINED_IDENTIFIER: |
| 63 return true; |
| 64 } |
| 65 |
| 66 switch (errorCode) { |
| 67 case CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE: |
| 68 case CompileTimeErrorCode.INVALID_ANNOTATION: |
| 69 case CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT: |
| 70 case CompileTimeErrorCode.PART_OF_NON_PART: |
| 71 case CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT: |
| 72 case CompileTimeErrorCode.URI_DOES_NOT_EXIST: |
| 73 return true; |
| 74 } |
| 75 |
| 76 switch (errorCode) { |
| 77 case HintCode.DEAD_CODE: |
| 78 case HintCode.DIVISION_OPTIMIZATION: |
| 79 case HintCode.TYPE_CHECK_IS_NOT_NULL: |
| 80 case HintCode.TYPE_CHECK_IS_NULL: |
| 81 case HintCode.UNDEFINED_GETTER: |
| 82 case HintCode.UNDEFINED_SETTER: |
| 83 case HintCode.UNNECESSARY_CAST: |
| 84 case HintCode.UNUSED_CATCH_CLAUSE: |
| 85 case HintCode.UNUSED_CATCH_STACK: |
| 86 case HintCode.UNUSED_IMPORT: |
| 87 case HintCode.UNDEFINED_METHOD: |
| 88 return true; |
| 89 } |
| 90 |
| 91 switch (errorCode) { |
| 92 case ParserErrorCode.EXPECTED_TOKEN: |
| 93 case ParserErrorCode.GETTER_WITH_PARAMETERS: |
| 94 case ParserErrorCode.VAR_AS_TYPE_NAME: |
| 95 return true; |
| 96 } |
| 97 |
| 98 switch (errorCode) { |
| 99 case StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE: |
| 100 case StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER: |
| 101 case StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION: |
| 102 case StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT: |
| 103 case StaticTypeWarningCode.UNDEFINED_FUNCTION: |
| 104 case StaticTypeWarningCode.UNDEFINED_GETTER: |
| 105 case StaticTypeWarningCode.UNDEFINED_METHOD: |
| 106 case StaticTypeWarningCode.UNDEFINED_SETTER: |
| 107 return true; |
| 108 } |
| 109 return false; |
| 110 } |
| 111 |
| 112 /** |
| 41 * An enumeration of possible quick fix kinds. | 113 * An enumeration of possible quick fix kinds. |
| 42 */ | 114 */ |
| 43 class DartFixKind { | 115 class DartFixKind { |
| 44 static const ADD_ASYNC = | 116 static const ADD_ASYNC = |
| 45 const FixKind('ADD_ASYNC', 50, "Add 'async' modifier"); | 117 const FixKind('ADD_ASYNC', 50, "Add 'async' modifier"); |
| 46 static const ADD_FIELD_FORMAL_PARAMETERS = const FixKind( | 118 static const ADD_FIELD_FORMAL_PARAMETERS = const FixKind( |
| 47 'ADD_FIELD_FORMAL_PARAMETERS', 30, "Add final field formal parameters"); | 119 'ADD_FIELD_FORMAL_PARAMETERS', 30, "Add final field formal parameters"); |
| 48 static const ADD_MISSING_PARAMETER_POSITIONAL = const FixKind( | 120 static const ADD_MISSING_PARAMETER_POSITIONAL = const FixKind( |
| 49 'ADD_MISSING_PARAMETER_POSITIONAL', | 121 'ADD_MISSING_PARAMETER_POSITIONAL', |
| 50 31, | 122 31, |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 131 static const USE_CONST = const FixKind('USE_CONST', 50, "Change to constant"); | 203 static const USE_CONST = const FixKind('USE_CONST', 50, "Change to constant"); |
| 132 static const USE_EFFECTIVE_INTEGER_DIVISION = const FixKind( | 204 static const USE_EFFECTIVE_INTEGER_DIVISION = const FixKind( |
| 133 'USE_EFFECTIVE_INTEGER_DIVISION', | 205 'USE_EFFECTIVE_INTEGER_DIVISION', |
| 134 50, | 206 50, |
| 135 "Use effective integer division ~/"); | 207 "Use effective integer division ~/"); |
| 136 static const USE_EQ_EQ_NULL = | 208 static const USE_EQ_EQ_NULL = |
| 137 const FixKind('USE_EQ_EQ_NULL', 50, "Use == null instead of 'is Null'"); | 209 const FixKind('USE_EQ_EQ_NULL', 50, "Use == null instead of 'is Null'"); |
| 138 static const USE_NOT_EQ_NULL = | 210 static const USE_NOT_EQ_NULL = |
| 139 const FixKind('USE_NOT_EQ_NULL', 50, "Use != null instead of 'is! Null'"); | 211 const FixKind('USE_NOT_EQ_NULL', 50, "Use != null instead of 'is! Null'"); |
| 140 } | 212 } |
| OLD | NEW |