From a900531934626e33ca160d91c313dfe2e204b9cb Mon Sep 17 00:00:00 2001 From: Konstantin Shcheglov Date: Thu, 9 Sep 2021 15:32:03 +0000 Subject: [PATCH] Don't read files in _isPackageReference() during MoveFileRefactoringImpl. We regularly get FileSystemException(s) like: at _PhysicalFile.readAsStringSync (physical_file_system.dart:184) at _OverlayFile.readAsStringSync (overlay_file_system.dart:206) at FileSource.contentsFromFile (source_resource.dart:68) at FileSource.contents (source_resource.dart:55) at MoveFileRefactoringImpl._isPackageReference (move_file.dart:183) So, instead we could use already recorded source content from which the element model was built. Alternatively we could record different kinds of references into the index, e.g. IS_REFERENCED_BY_PACKAGE_URI or IS_REFERENCED_BY. Change-Id: Ic4aa839f706f37c9df2504f866dfca7c7581c347 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/212860 Reviewed-by: Brian Wilkerson Commit-Queue: Konstantin Shcheglov --- .../lib/src/services/refactoring/move_file.dart | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/pkg/analysis_server/lib/src/services/refactoring/move_file.dart b/pkg/analysis_server/lib/src/services/refactoring/move_file.dart index 6e9707235a2..456dc38af3b 100644 --- a/pkg/analysis_server/lib/src/services/refactoring/move_file.dart +++ b/pkg/analysis_server/lib/src/services/refactoring/move_file.dart @@ -8,8 +8,10 @@ import 'package:analysis_server/src/services/refactoring/refactoring.dart'; import 'package:analysis_server/src/services/refactoring/refactoring_internal.dart'; import 'package:analyzer/dart/analysis/results.dart'; import 'package:analyzer/dart/ast/ast.dart'; +import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/file_system/file_system.dart'; import 'package:analyzer/src/dart/analysis/driver.dart'; +import 'package:analyzer/src/dart/element/element.dart'; import 'package:analyzer/src/generated/source.dart'; import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart'; import 'package:analyzer_plugin/utilities/range_factory.dart'; @@ -177,8 +179,11 @@ class MoveFileRefactoringImpl extends RefactoringImpl } bool _isPackageReference(SourceReference reference) { - var source = reference.element.source!; - var quotedImportUri = source.contents.data.substring(reference.range.offset, + var unitSourceContent = reference.element.unitSourceContent; + if (unitSourceContent == null) { + return false; + } + var quotedImportUri = unitSourceContent.substring(reference.range.offset, reference.range.offset + reference.range.length); return packagePrefixedStringPattern.hasMatch(quotedImportUri); } @@ -215,3 +220,10 @@ class MoveFileRefactoringImpl extends RefactoringImpl } } } + +extension on Element { + String? get unitSourceContent { + var unitElement = thisOrAncestorOfType(); + return unitElement?.sourceContent; + } +}