Skip to content

Commit d59c337

Browse files
committed
perf: use PsiFile instead of using VirtualFile
Signed-off-by: azerr <[email protected]>
1 parent 2c3502d commit d59c337

File tree

37 files changed

+147
-123
lines changed

37 files changed

+147
-123
lines changed

src/main/java/com/redhat/devtools/lsp4ij/ConnectDocumentToLanguageServerSetupParticipant.java

+8-5
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,14 @@ public void fileClosed(@NotNull FileEditorManager source, @NotNull VirtualFile f
6565
}
6666

6767
private static void connectToLanguageServer(@NotNull VirtualFile file, @NotNull Project project) {
68-
// Force the start of all languages servers mapped with the given file
69-
// Server capabilities filter is set to null to avoid waiting
70-
// for the start of the server when server capabilities are checked
71-
LanguageServiceAccessor.getInstance(project)
72-
.getLanguageServers(file, null, null);
68+
PsiFile psiFile = LSPIJUtils.getPsiFile(file, project);
69+
if (psiFile != null) {
70+
// Force the start of all languages servers mapped with the given file
71+
// Server capabilities filter is set to null to avoid waiting
72+
// for the start of the server when server capabilities are checked
73+
LanguageServiceAccessor.getInstance(project)
74+
.getLanguageServers(psiFile, null, null);
75+
}
7376
}
7477

7578
}

src/main/java/com/redhat/devtools/lsp4ij/LSPIJEditorUtils.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -400,7 +400,7 @@ private ClientFeaturesBasedCommenter(@NotNull PsiFile file) {
400400
@Nullable
401401
private static LSPClientFeatures getClientFeatures(@NotNull PsiFile file) {
402402
CompletableFuture<List<LanguageServerItem>> languageServersFuture = LanguageServiceAccessor.getInstance(file.getProject()).getLanguageServers(
403-
file.getVirtualFile(),
403+
file,
404404
clientFeatures -> StringUtil.isNotEmpty(clientFeatures.getLineCommentPrefix(file)) ||
405405
StringUtil.isNotEmpty(clientFeatures.getBlockCommentPrefix(file)) ||
406406
StringUtil.isNotEmpty(clientFeatures.getBlockCommentSuffix(file)),

src/main/java/com/redhat/devtools/lsp4ij/LSPIJUtils.java

+11-1
Original file line numberDiff line numberDiff line change
@@ -565,6 +565,16 @@ private static Language doGetFileLanguage(@NotNull VirtualFile file, @NotNull Pr
565565
}
566566

567567

568+
/**
569+
* Returns the virtual file corresponding to the PSI file.
570+
*
571+
* @param psiFile the PSI file
572+
* @return the virtual file, or {@code null} if the file exists only in memory.
573+
*/
574+
public static @Nullable VirtualFile getFile(@NotNull PsiFile psiFile) {
575+
return psiFile.getVirtualFile();
576+
}
577+
568578
/**
569579
* Returns the virtual file corresponding to the PSI element.
570580
*
@@ -573,7 +583,7 @@ private static Language doGetFileLanguage(@NotNull VirtualFile file, @NotNull Pr
573583
*/
574584
public static @Nullable VirtualFile getFile(@NotNull PsiElement element) {
575585
PsiFile psFile = element.getContainingFile();
576-
return psFile != null ? psFile.getVirtualFile() : null;
586+
return psFile != null ? getFile(psFile) : null;
577587
}
578588

579589
/**

src/main/java/com/redhat/devtools/lsp4ij/LanguageServersRegistry.java

+24-23
Original file line numberDiff line numberDiff line change
@@ -31,19 +31,8 @@
3131
import com.redhat.devtools.lsp4ij.internal.StringUtils;
3232
import com.redhat.devtools.lsp4ij.launching.ServerMappingSettings;
3333
import com.redhat.devtools.lsp4ij.launching.UserDefinedLanguageServerSettings;
34-
import com.redhat.devtools.lsp4ij.server.definition.LanguageServerDefinition;
35-
import com.redhat.devtools.lsp4ij.server.definition.LanguageServerDefinitionListener;
36-
import com.redhat.devtools.lsp4ij.server.definition.LanguageServerFileAssociation;
37-
import com.redhat.devtools.lsp4ij.server.definition.ServerFileNamePatternMapping;
38-
import com.redhat.devtools.lsp4ij.server.definition.ServerFileTypeMapping;
39-
import com.redhat.devtools.lsp4ij.server.definition.ServerLanguageMapping;
40-
import com.redhat.devtools.lsp4ij.server.definition.ServerMapping;
41-
import com.redhat.devtools.lsp4ij.server.definition.extension.ExtensionLanguageServerDefinition;
42-
import com.redhat.devtools.lsp4ij.server.definition.extension.FileNamePatternMappingExtensionPointBean;
43-
import com.redhat.devtools.lsp4ij.server.definition.extension.FileTypeMappingExtensionPointBean;
44-
import com.redhat.devtools.lsp4ij.server.definition.extension.LanguageMappingExtensionPointBean;
45-
import com.redhat.devtools.lsp4ij.server.definition.extension.SemanticTokensColorsProviderExtensionPointBean;
46-
import com.redhat.devtools.lsp4ij.server.definition.extension.ServerExtensionPointBean;
34+
import com.redhat.devtools.lsp4ij.server.definition.*;
35+
import com.redhat.devtools.lsp4ij.server.definition.extension.*;
4736
import com.redhat.devtools.lsp4ij.server.definition.launching.UserDefinedLanguageServerDefinition;
4837
import com.redhat.devtools.lsp4ij.usages.LSPFindUsagesProvider;
4938
import org.jetbrains.annotations.ApiStatus;
@@ -286,13 +275,13 @@ private static String getServerNotAvailableMessage(ServerMapping mapping) {
286275
/**
287276
* @param language the language
288277
* @param fileType the file type.
289-
* @param file
278+
* @param fileName the file name
290279
* @return the {@link LanguageServerDefinition}s <strong>directly</strong> associated to the given content-type.
291280
* This does <strong>not</strong> include the one that match transitively as per content-type hierarchy
292281
*/
293-
List<LanguageServerFileAssociation> findLanguageServerDefinitionFor(final @Nullable Language language, @Nullable FileType fileType, @NotNull VirtualFile file) {
282+
List<LanguageServerFileAssociation> findLanguageServerDefinitionFor(final @Nullable Language language, @Nullable FileType fileType, @NotNull String fileName) {
294283
return fileAssociations.stream()
295-
.filter(mapping -> mapping.match(language, fileType, file.getName()))
284+
.filter(mapping -> mapping.match(language, fileType, fileName))
296285
.collect(Collectors.toList());
297286
}
298287

@@ -475,7 +464,7 @@ private void removeAssociationsFor(LanguageServerDefinition definition) {
475464
settings.setMappings(request.mappings());
476465

477466
if (nameChanged || commandChanged || userEnvironmentVariablesChanged || includeSystemEnvironmentVariablesChanged ||
478-
mappingsChanged || configurationContentChanged || initializationOptionsContentChanged) {
467+
mappingsChanged || configurationContentChanged || initializationOptionsContentChanged) {
479468
// Notifications
480469
LanguageServerDefinitionListener.LanguageServerChangedEvent event = new LanguageServerDefinitionListener.LanguageServerChangedEvent(
481470
request.project(),
@@ -523,7 +512,9 @@ public boolean isFileSupported(@Nullable PsiFile file) {
523512
if (file == null) {
524513
return false;
525514
}
526-
return isFileSupported(file.getVirtualFile(), file.getProject());
515+
Language language = file.getLanguage();
516+
FileType fileType = file.getFileType();
517+
return isFileSupported(language, fileType, file.getName(), null, file, file.getProject());
527518
}
528519

529520
/**
@@ -539,15 +530,25 @@ public boolean isFileSupported(@Nullable VirtualFile file, @NotNull Project proj
539530
}
540531
Language language = LSPIJUtils.getFileLanguage(file, project);
541532
FileType fileType = file.getFileType();
533+
return isFileSupported(language, fileType, file.getName(), file, null, project);
534+
}
535+
536+
private boolean isFileSupported(@Nullable Language language,
537+
@Nullable FileType fileType,
538+
@NotNull String filename,
539+
@Nullable VirtualFile file,
540+
@Nullable PsiFile psiFile,
541+
@NotNull Project project) {
542542
if (fileAssociations
543543
.stream()
544-
.anyMatch(mapping -> mapping.match(language, fileType, file.getName()))) {
545-
if (!file.isInLocalFileSystem()) {
546-
if (file instanceof LightVirtualFile) {
544+
.anyMatch(mapping -> mapping.match(language, fileType, filename))) {
545+
VirtualFile f = file != null ? file : psiFile.getVirtualFile();
546+
if (!f.isInLocalFileSystem()) {
547+
if (f instanceof LightVirtualFile) {
547548
return false;
548549
}
549-
PsiFile psiFile = LSPIJUtils.getPsiFile(file, project);
550-
if (psiFile != null && !psiFile.isPhysical()) {
550+
PsiFile pf = psiFile != null ? psiFile : LSPIJUtils.getPsiFile(file, project);
551+
if (pf != null && !pf.isPhysical()) {
551552
return false;
552553
}
553554
}

0 commit comments

Comments
 (0)