Index: pkg/analyzer/lib/src/dart/analysis/file_state.dart |
diff --git a/pkg/analyzer/lib/src/dart/analysis/file_state.dart b/pkg/analyzer/lib/src/dart/analysis/file_state.dart |
index 67894b115c57fce78a10b05167744cce2b977bc2..7138a7ecdd053061ffbe0f5d0b2c5e569086ace9 100644 |
--- a/pkg/analyzer/lib/src/dart/analysis/file_state.dart |
+++ b/pkg/analyzer/lib/src/dart/analysis/file_state.dart |
@@ -16,6 +16,9 @@ import 'package:analyzer/src/dart/analysis/referenced_names.dart'; |
import 'package:analyzer/src/dart/analysis/top_level_declaration.dart'; |
import 'package:analyzer/src/dart/scanner/reader.dart'; |
import 'package:analyzer/src/dart/scanner/scanner.dart'; |
+import 'package:analyzer/src/fasta/ast_builder.dart' as fasta; |
+import 'package:analyzer/src/fasta/element_store.dart' as fasta; |
+import 'package:analyzer/src/fasta/mock_element.dart' as fasta; |
import 'package:analyzer/src/generated/engine.dart'; |
import 'package:analyzer/src/generated/parser.dart'; |
import 'package:analyzer/src/generated/source.dart'; |
@@ -28,9 +31,6 @@ import 'package:analyzer/src/summary/name_filter.dart'; |
import 'package:analyzer/src/summary/summarize_ast.dart'; |
import 'package:convert/convert.dart'; |
import 'package:crypto/crypto.dart'; |
-import 'package:analyzer/src/fasta/ast_builder.dart' as fasta; |
-import 'package:analyzer/src/fasta/element_store.dart' as fasta; |
-import 'package:analyzer/src/fasta/mock_element.dart' as fasta; |
import 'package:front_end/src/fasta/builder/builder.dart' as fasta; |
import 'package:front_end/src/fasta/parser/parser.dart' as fasta; |
import 'package:front_end/src/fasta/scanner.dart' as fasta; |
@@ -502,28 +502,22 @@ class FileState { |
for (UnlinkedImport import in _unlinked.imports) { |
String uri = import.isImplicit ? 'dart:core' : import.uri; |
FileState file = _fileForRelativeUri(uri); |
- if (file != null) { |
- _importedFiles.add(file); |
- } |
+ _importedFiles.add(file); |
} |
for (UnlinkedExportPublic export in _unlinked.publicNamespace.exports) { |
String uri = export.uri; |
FileState file = _fileForRelativeUri(uri); |
- if (file != null) { |
- _exportedFiles.add(file); |
- _exportFilters |
- .add(new NameFilter.forUnlinkedCombinators(export.combinators)); |
- } |
+ _exportedFiles.add(file); |
+ _exportFilters |
+ .add(new NameFilter.forUnlinkedCombinators(export.combinators)); |
} |
for (String uri in _unlinked.publicNamespace.parts) { |
FileState file = _fileForRelativeUri(uri); |
- if (file != null) { |
- _partedFiles.add(file); |
- // TODO(scheglov) Sort for stable results? |
- _fsState._partToLibraries |
- .putIfAbsent(file, () => <FileState>[]) |
- .add(this); |
- } |
+ _partedFiles.add(file); |
+ // TODO(scheglov) Sort for stable results? |
+ _fsState._partToLibraries |
+ .putIfAbsent(file, () => <FileState>[]) |
+ .add(this); |
} |
// Compute referenced files. |
@@ -554,16 +548,21 @@ class FileState { |
String toString() => path; |
/** |
- * Return the [FileState] for the given [relativeUri], or `null` if the URI |
- * cannot be parsed, cannot correspond any file, etc. |
+ * Return the [FileState] for the given [relativeUri], maybe "unresolved" |
+ * file if the URI cannot be parsed, cannot correspond any file, etc. |
*/ |
FileState _fileForRelativeUri(String relativeUri) { |
+ if (relativeUri.isEmpty) { |
+ return _fsState.unresolvedFile; |
+ } |
+ |
Uri absoluteUri; |
try { |
absoluteUri = resolveRelativeUri(uri, Uri.parse(relativeUri)); |
} on FormatException { |
- return null; |
+ return _fsState.unresolvedFile; |
} |
+ |
return _fsState.getFileForUri(absoluteUri); |
} |
@@ -630,6 +629,11 @@ class FileSystemState { |
*/ |
final Map<FileState, List<FileState>> _partToLibraries = {}; |
+ /** |
+ * The [FileState] instance that correspond to an unresolved URI. |
+ */ |
+ FileState _unresolvedFile; |
+ |
FileSystemStateTestView _testView; |
FileSystemState( |
@@ -653,6 +657,17 @@ class FileSystemState { |
FileSystemStateTestView get test => _testView; |
/** |
+ * Return the [FileState] instance that correspond to an unresolved URI. |
+ */ |
+ FileState get unresolvedFile { |
+ if (_unresolvedFile == null) { |
+ _unresolvedFile = new FileState._(this, null, null, null); |
+ _unresolvedFile.refresh(); |
+ } |
+ return _unresolvedFile; |
+ } |
+ |
+ /** |
* Return the canonical [FileState] for the given absolute [path]. The |
* returned file has the last known state since if was last refreshed. |
* |
@@ -692,11 +707,14 @@ class FileSystemState { |
FileState file = _uriToFile[uri]; |
if (file == null) { |
Source uriSource = _sourceFactory.resolveUri(null, uri.toString()); |
- // If the URI is invalid, for example package:/test/d.dart (note the |
- // leading '/'), then `null` is returned. We should ignore this URI. |
+ |
+ // If the URI cannot be resolved, for example because the factory |
+ // does not understand the scheme, return the unresolved file instance. |
if (uriSource == null) { |
- return null; |
+ _uriToFile[uri] = unresolvedFile; |
+ return unresolvedFile; |
} |
+ |
String path = uriSource.fullName; |
File resource = _resourceProvider.getFile(path); |
FileSource source = new FileSource(resource, uri); |