fix(language-service): do not treat file URIs as general URLs #39917
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
In the past, the legacy (VE-based) language service would use a
UrlResolver
instance to resolve file paths, primarily for compilerresources like external templates. The problem with this is that the
UrlResolver is designed to resolve URLs in general, and so for a path
like
/a/b/#c
,#c
is treated as hash/fragment rather than as partof the path, which can lead to unexpected path resolution (f.x.,
resolve('a/b/#c/d.ts', './d.html')
would produce'a/b/d.html'
ratherthan the expected
'a/b/#c/d.html'
).This commit resolves the issue by using Node's
path
module to resolvefile paths directly, which aligns more with how resources are resolved
in the Ivy compiler.
The testing story here is not great, and the API for validating a file
path could be a little bit prettier/robust. However, since the VE-based
language service is going into more of a "maintenance mode" now that
there is a clear path for the Ivy-based LS moving forward, I think it is
okay not to spend too much time here.
Closes angular/vscode-ng-language-service#892
Closes angular/vscode-ng-language-service#1001