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 <brianwilkerson@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
This commit is contained in:
Konstantin Shcheglov
2021-09-09 15:32:03 +00:00
committed by commit-bot@chromium.org
parent 61ed30ac75
commit a900531934
@@ -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<CompilationUnitElementImpl>();
return unitElement?.sourceContent;
}
}