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 edit.domain; | 5 library edit.domain; |
6 | 6 |
7 import 'dart:async'; | 7 import 'dart:async'; |
8 | 8 |
9 import 'package:analysis_server/plugin/edit/assist/assist_core.dart'; | 9 import 'package:analysis_server/plugin/edit/assist/assist_core.dart'; |
10 import 'package:analysis_server/plugin/edit/assist/assist_dart.dart'; | 10 import 'package:analysis_server/plugin/edit/assist/assist_dart.dart'; |
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
194 newAnalysisError_fromEngine(lineInfo, error); | 194 newAnalysisError_fromEngine(lineInfo, error); |
195 AnalysisErrorFixes errorFixes = new AnalysisErrorFixes(serverError); | 195 AnalysisErrorFixes errorFixes = new AnalysisErrorFixes(serverError); |
196 errorFixesList.add(errorFixes); | 196 errorFixesList.add(errorFixes); |
197 fixes.forEach((fix) { | 197 fixes.forEach((fix) { |
198 errorFixes.fixes.add(fix.change); | 198 errorFixes.fixes.add(fix.change); |
199 }); | 199 }); |
200 } | 200 } |
201 } | 201 } |
202 } | 202 } |
203 } else { | 203 } else { |
204 List<CompilationUnit> units = server.getResolvedCompilationUnits(file); | 204 CompilationUnit unit = server.getResolvedCompilationUnit(file); |
205 for (CompilationUnit unit in units) { | 205 engine.AnalysisErrorInfo errorInfo = server.getErrors(file); |
206 engine.AnalysisErrorInfo errorInfo = server.getErrors(file); | 206 if (errorInfo != null) { |
207 if (errorInfo != null) { | 207 LineInfo lineInfo = errorInfo.lineInfo; |
208 LineInfo lineInfo = errorInfo.lineInfo; | 208 int requestLine = lineInfo.getLocation(offset).lineNumber; |
209 int requestLine = lineInfo.getLocation(offset).lineNumber; | 209 for (engine.AnalysisError error in errorInfo.errors) { |
210 for (engine.AnalysisError error in errorInfo.errors) { | 210 int errorLine = lineInfo.getLocation(error.offset).lineNumber; |
211 int errorLine = lineInfo.getLocation(error.offset).lineNumber; | 211 if (errorLine == requestLine) { |
212 if (errorLine == requestLine) { | 212 List<Fix> fixes = await computeFixes(server.serverPlugin, |
213 List<Fix> fixes = await computeFixes(server.serverPlugin, | 213 server.resourceProvider, unit.element.context, error); |
214 server.resourceProvider, unit.element.context, error); | 214 if (fixes.isNotEmpty) { |
215 if (fixes.isNotEmpty) { | 215 AnalysisError serverError = |
216 AnalysisError serverError = | 216 newAnalysisError_fromEngine(lineInfo, error); |
217 newAnalysisError_fromEngine(lineInfo, error); | 217 AnalysisErrorFixes errorFixes = |
218 AnalysisErrorFixes errorFixes = | 218 new AnalysisErrorFixes(serverError); |
219 new AnalysisErrorFixes(serverError); | 219 errorFixesList.add(errorFixes); |
220 errorFixesList.add(errorFixes); | 220 fixes.forEach((fix) { |
221 fixes.forEach((fix) { | 221 errorFixes.fixes.add(fix.change); |
222 errorFixes.fixes.add(fix.change); | 222 }); |
223 }); | |
224 } | |
225 } | 223 } |
226 } | 224 } |
227 } | 225 } |
228 } | 226 } |
229 } | 227 } |
230 | 228 |
231 // Send the response. | 229 // Send the response. |
232 server.sendResponse( | 230 server.sendResponse( |
233 new EditGetFixesResult(errorFixesList).toResponse(request.id)); | 231 new EditGetFixesResult(errorFixesList).toResponse(request.id)); |
234 } | 232 } |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
279 AnalysisResult result = await server.getAnalysisResult(file); | 277 AnalysisResult result = await server.getAnalysisResult(file); |
280 if (result == null) { | 278 if (result == null) { |
281 server.sendResponse(new Response.fileNotAnalyzed(request, file)); | 279 server.sendResponse(new Response.fileNotAnalyzed(request, file)); |
282 return; | 280 return; |
283 } | 281 } |
284 fileStamp = -1; | 282 fileStamp = -1; |
285 code = result.content; | 283 code = result.content; |
286 unit = result.unit; | 284 unit = result.unit; |
287 errors = result.errors; | 285 errors = result.errors; |
288 } else { | 286 } else { |
289 // prepare resolved units | 287 // prepare resolved unit |
290 List<CompilationUnit> units = server.getResolvedCompilationUnits(file); | 288 unit = server.getResolvedCompilationUnit(file); |
291 if (units.isEmpty) { | 289 if (unit == null) { |
292 server.sendResponse(new Response.fileNotAnalyzed(request, file)); | 290 server.sendResponse(new Response.fileNotAnalyzed(request, file)); |
293 return; | 291 return; |
294 } | 292 } |
295 // prepare context | 293 // prepare context |
296 unit = units.first; | |
297 engine.AnalysisContext context = unit.element.context; | 294 engine.AnalysisContext context = unit.element.context; |
298 Source source = unit.element.source; | 295 Source source = unit.element.source; |
299 errors = context.computeErrors(source); | 296 errors = context.computeErrors(source); |
300 // prepare code | 297 // prepare code |
301 fileStamp = context.getModificationStamp(source); | 298 fileStamp = context.getModificationStamp(source); |
302 code = context.getContents(source).data; | 299 code = context.getContents(source).data; |
303 } | 300 } |
304 // check if there are scan/parse errors in the file | 301 // check if there are scan/parse errors in the file |
305 int numScanParseErrors = _getNumberOfScanParseErrors(errors); | 302 int numScanParseErrors = _getNumberOfScanParseErrors(errors); |
306 if (numScanParseErrors != 0) { | 303 if (numScanParseErrors != 0) { |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
393 int length = params.length; | 390 int length = params.length; |
394 // add refactoring kinds | 391 // add refactoring kinds |
395 List<RefactoringKind> kinds = <RefactoringKind>[]; | 392 List<RefactoringKind> kinds = <RefactoringKind>[]; |
396 // try EXTRACT_* | 393 // try EXTRACT_* |
397 if (length != 0) { | 394 if (length != 0) { |
398 kinds.add(RefactoringKind.EXTRACT_LOCAL_VARIABLE); | 395 kinds.add(RefactoringKind.EXTRACT_LOCAL_VARIABLE); |
399 kinds.add(RefactoringKind.EXTRACT_METHOD); | 396 kinds.add(RefactoringKind.EXTRACT_METHOD); |
400 } | 397 } |
401 // check elements | 398 // check elements |
402 { | 399 { |
403 List<Element> elements = server.getElementsAtOffset(file, offset); | 400 Element element = server.getElementAtOffset(file, offset); |
404 if (elements.isNotEmpty) { | 401 if (element != null) { |
405 Element element = elements[0]; | |
406 // try CONVERT_METHOD_TO_GETTER | 402 // try CONVERT_METHOD_TO_GETTER |
407 if (element is ExecutableElement) { | 403 if (element is ExecutableElement) { |
408 Refactoring refactoring = | 404 Refactoring refactoring = |
409 new ConvertMethodToGetterRefactoring(searchEngine, element); | 405 new ConvertMethodToGetterRefactoring(searchEngine, element); |
410 RefactoringStatus status = await refactoring.checkInitialConditions(); | 406 RefactoringStatus status = await refactoring.checkInitialConditions(); |
411 if (!status.hasFatalError) { | 407 if (!status.hasFatalError) { |
412 kinds.add(RefactoringKind.CONVERT_METHOD_TO_GETTER); | 408 kinds.add(RefactoringKind.CONVERT_METHOD_TO_GETTER); |
413 } | 409 } |
414 } | 410 } |
415 // try RENAME | 411 // try RENAME |
(...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
701 this.kind = kind; | 697 this.kind = kind; |
702 this.file = file; | 698 this.file = file; |
703 this.offset = offset; | 699 this.offset = offset; |
704 this.length = length; | 700 this.length = length; |
705 // simulate an exception | 701 // simulate an exception |
706 if (test_simulateRefactoringException_init) { | 702 if (test_simulateRefactoringException_init) { |
707 throw 'A simulated refactoring exception - init.'; | 703 throw 'A simulated refactoring exception - init.'; |
708 } | 704 } |
709 // create a new Refactoring instance | 705 // create a new Refactoring instance |
710 if (kind == RefactoringKind.CONVERT_GETTER_TO_METHOD) { | 706 if (kind == RefactoringKind.CONVERT_GETTER_TO_METHOD) { |
711 List<Element> elements = server.getElementsAtOffset(file, offset); | 707 Element element = server.getElementAtOffset(file, offset); |
712 if (elements.isNotEmpty) { | 708 if (element != null) { |
713 Element element = elements[0]; | |
714 if (element is ExecutableElement) { | 709 if (element is ExecutableElement) { |
715 _resetOnAnalysisStarted(); | 710 _resetOnAnalysisStarted(); |
716 refactoring = | 711 refactoring = |
717 new ConvertGetterToMethodRefactoring(searchEngine, element); | 712 new ConvertGetterToMethodRefactoring(searchEngine, element); |
718 } | 713 } |
719 } | 714 } |
720 } | 715 } |
721 if (kind == RefactoringKind.CONVERT_METHOD_TO_GETTER) { | 716 if (kind == RefactoringKind.CONVERT_METHOD_TO_GETTER) { |
722 List<Element> elements = server.getElementsAtOffset(file, offset); | 717 Element element = server.getElementAtOffset(file, offset); |
723 if (elements.isNotEmpty) { | 718 if (element != null) { |
724 Element element = elements[0]; | |
725 if (element is ExecutableElement) { | 719 if (element is ExecutableElement) { |
726 _resetOnAnalysisStarted(); | 720 _resetOnAnalysisStarted(); |
727 refactoring = | 721 refactoring = |
728 new ConvertMethodToGetterRefactoring(searchEngine, element); | 722 new ConvertMethodToGetterRefactoring(searchEngine, element); |
729 } | 723 } |
730 } | 724 } |
731 } | 725 } |
732 if (kind == RefactoringKind.EXTRACT_LOCAL_VARIABLE) { | 726 if (kind == RefactoringKind.EXTRACT_LOCAL_VARIABLE) { |
733 List<CompilationUnit> units = server.getResolvedCompilationUnits(file); | 727 CompilationUnit unit = server.getResolvedCompilationUnit(file); |
734 if (units.isNotEmpty) { | 728 if (unit != null) { |
735 _resetOnFileResolutionChanged(file); | 729 _resetOnFileResolutionChanged(file); |
736 refactoring = new ExtractLocalRefactoring(units[0], offset, length); | 730 refactoring = new ExtractLocalRefactoring(unit, offset, length); |
737 feedback = new ExtractLocalVariableFeedback( | 731 feedback = new ExtractLocalVariableFeedback( |
738 <String>[], <int>[], <int>[], | 732 <String>[], <int>[], <int>[], |
739 coveringExpressionOffsets: <int>[], | 733 coveringExpressionOffsets: <int>[], |
740 coveringExpressionLengths: <int>[]); | 734 coveringExpressionLengths: <int>[]); |
741 } | 735 } |
742 } | 736 } |
743 if (kind == RefactoringKind.EXTRACT_METHOD) { | 737 if (kind == RefactoringKind.EXTRACT_METHOD) { |
744 List<CompilationUnit> units = server.getResolvedCompilationUnits(file); | 738 CompilationUnit unit = server.getResolvedCompilationUnit(file); |
745 if (units.isNotEmpty) { | 739 if (unit != null) { |
746 _resetOnAnalysisStarted(); | 740 _resetOnAnalysisStarted(); |
747 refactoring = new ExtractMethodRefactoring( | 741 refactoring = |
748 searchEngine, units[0], offset, length); | 742 new ExtractMethodRefactoring(searchEngine, unit, offset, length); |
749 feedback = new ExtractMethodFeedback(offset, length, '', <String>[], | 743 feedback = new ExtractMethodFeedback(offset, length, '', <String>[], |
750 false, <RefactoringMethodParameter>[], <int>[], <int>[]); | 744 false, <RefactoringMethodParameter>[], <int>[], <int>[]); |
751 } | 745 } |
752 } | 746 } |
753 if (kind == RefactoringKind.INLINE_LOCAL_VARIABLE) { | 747 if (kind == RefactoringKind.INLINE_LOCAL_VARIABLE) { |
754 List<CompilationUnit> units = server.getResolvedCompilationUnits(file); | 748 CompilationUnit unit = server.getResolvedCompilationUnit(file); |
755 if (units.isNotEmpty) { | 749 if (unit != null) { |
756 _resetOnFileResolutionChanged(file); | 750 _resetOnFileResolutionChanged(file); |
757 refactoring = | 751 refactoring = new InlineLocalRefactoring(searchEngine, unit, offset); |
758 new InlineLocalRefactoring(searchEngine, units[0], offset); | |
759 } | 752 } |
760 } | 753 } |
761 if (kind == RefactoringKind.INLINE_METHOD) { | 754 if (kind == RefactoringKind.INLINE_METHOD) { |
762 List<CompilationUnit> units = server.getResolvedCompilationUnits(file); | 755 CompilationUnit unit = server.getResolvedCompilationUnit(file); |
763 if (units.isNotEmpty) { | 756 if (unit != null) { |
764 _resetOnAnalysisStarted(); | 757 _resetOnAnalysisStarted(); |
765 refactoring = | 758 refactoring = new InlineMethodRefactoring(searchEngine, unit, offset); |
766 new InlineMethodRefactoring(searchEngine, units[0], offset); | |
767 } | 759 } |
768 } | 760 } |
769 if (kind == RefactoringKind.MOVE_FILE) { | 761 if (kind == RefactoringKind.MOVE_FILE) { |
770 _resetOnAnalysisStarted(); | 762 _resetOnAnalysisStarted(); |
771 ContextSourcePair contextSource = server.getContextSourcePair(file); | 763 ContextSourcePair contextSource = server.getContextSourcePair(file); |
772 engine.AnalysisContext context = contextSource.context; | 764 engine.AnalysisContext context = contextSource.context; |
773 Source source = contextSource.source; | 765 Source source = contextSource.source; |
774 refactoring = new MoveFileRefactoring( | 766 refactoring = new MoveFileRefactoring( |
775 server.resourceProvider, searchEngine, context, source, file); | 767 server.resourceProvider, searchEngine, context, source, file); |
776 } | 768 } |
777 if (kind == RefactoringKind.RENAME) { | 769 if (kind == RefactoringKind.RENAME) { |
778 List<AstNode> nodes = server.getNodesAtOffset(file, offset); | 770 AstNode node = server.getNodeAtOffset(file, offset); |
779 List<Element> elements = server.getElementsOfNodes(nodes); | 771 Element element = server.getElementOfNode(node); |
780 if (nodes.isNotEmpty && elements.isNotEmpty) { | 772 if (node != null && element != null) { |
781 AstNode node = nodes[0]; | |
782 Element element = elements[0]; | |
783 if (element is FieldFormalParameterElement) { | 773 if (element is FieldFormalParameterElement) { |
784 element = (element as FieldFormalParameterElement).field; | 774 element = (element as FieldFormalParameterElement).field; |
785 } | 775 } |
786 // climb from "Class" in "new Class.named()" to "Class.named" | 776 // climb from "Class" in "new Class.named()" to "Class.named" |
787 if (node.parent is TypeName && node.parent.parent is ConstructorName) { | 777 if (node.parent is TypeName && node.parent.parent is ConstructorName) { |
788 ConstructorName constructor = node.parent.parent; | 778 ConstructorName constructor = node.parent.parent; |
789 node = constructor; | 779 node = constructor; |
790 element = constructor.staticElement; | 780 element = constructor.staticElement; |
791 } | 781 } |
792 // do create the refactoring | 782 // do create the refactoring |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
944 } | 934 } |
945 return new RefactoringStatus(); | 935 return new RefactoringStatus(); |
946 } | 936 } |
947 } | 937 } |
948 | 938 |
949 /** | 939 /** |
950 * [_RefactoringManager] throws instances of this class internally to stop | 940 * [_RefactoringManager] throws instances of this class internally to stop |
951 * processing in a manager that was reset. | 941 * processing in a manager that was reset. |
952 */ | 942 */ |
953 class _ResetError {} | 943 class _ResetError {} |
OLD | NEW |