fix "IDEA-221944 Deadlock on opening second project" and support preloading for proje...
[idea/community.git] / platform / core-impl / src / com / intellij / psi / DummyHolderViewProvider.java
1 // Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
2 package com.intellij.psi;
3
4 import com.intellij.lang.Language;
5 import com.intellij.openapi.fileTypes.UnknownFileType;
6 import com.intellij.openapi.vfs.VirtualFile;
7 import com.intellij.psi.impl.SharedPsiElementImplUtil;
8 import com.intellij.psi.impl.source.DummyHolder;
9 import com.intellij.psi.impl.source.tree.FileElement;
10 import com.intellij.psi.impl.source.tree.LeafElement;
11 import com.intellij.testFramework.LightVirtualFile;
12 import com.intellij.util.LocalTimeCounter;
13 import org.jetbrains.annotations.NotNull;
14 import org.jetbrains.annotations.Nullable;
15
16 import java.util.Collections;
17 import java.util.List;
18 import java.util.Set;
19
20 public class DummyHolderViewProvider extends AbstractFileViewProvider {
21   private DummyHolder myHolder;
22   private final long myModificationStamp;
23
24   public DummyHolderViewProvider(@NotNull PsiManager manager) {
25     super(manager, new LightVirtualFile("DummyHolder"), false, UnknownFileType.INSTANCE);
26     myModificationStamp = LocalTimeCounter.currentTime();
27   }
28
29   @Override
30   @NotNull
31   public CharSequence getContents() {
32     return myHolder != null ? myHolder.getNode().getText() : "";
33   }
34
35   @Override
36   @NotNull
37   public Language getBaseLanguage() {
38     return myHolder.getLanguage();
39   }
40
41   @Override
42   @NotNull
43   public Set<Language> getLanguages() {
44     return Collections.singleton(getBaseLanguage());
45   }
46
47   @Nullable
48   @Override
49   protected PsiFile getPsiInner(Language target) {
50     return getCachedPsi(target);
51   }
52
53   @Override
54   public PsiFile getCachedPsi(@NotNull Language target) {
55     getManager().getFileManager().setViewProvider(getVirtualFile(), this);
56     return target == getBaseLanguage() ? myHolder : null;
57   }
58
59   @NotNull
60   @Override
61   public List<PsiFile> getCachedPsiFiles() {
62     return Collections.singletonList(myHolder);
63   }
64
65   @NotNull
66   @Override
67   public List<FileElement> getKnownTreeRoots() {
68     return Collections.singletonList(myHolder.getTreeElement());
69   }
70
71   @Override
72   @NotNull
73   public List<PsiFile> getAllFiles() {
74     return getCachedPsiFiles();
75   }
76
77   @Override
78   public long getModificationStamp() {
79     return myModificationStamp;
80   }
81
82   public void setDummyHolder(@NotNull DummyHolder dummyHolder) {
83     myHolder = dummyHolder;
84     ((LightVirtualFile)getVirtualFile()).setFileType(dummyHolder.getFileType());
85   }
86
87   @Override
88   public PsiReference findReferenceAt(final int offset) {
89     return SharedPsiElementImplUtil.findReferenceAt(getPsi(getBaseLanguage()), offset);
90   }
91
92   @Override
93   public PsiElement findElementAt(int offset, @NotNull Class<? extends Language> lang) {
94     if (!lang.isAssignableFrom(getBaseLanguage().getClass())) return null;
95     return findElementAt(offset);
96   }
97
98   @NotNull
99   @Override
100   public FileViewProvider createCopy(@NotNull final VirtualFile copy) {
101     throw new RuntimeException("Clone is not supported for DummyHolderProviders. Use DummyHolder clone directly.");
102   }
103
104   @Override
105   public PsiElement findElementAt(final int offset) {
106     final LeafElement element = myHolder.calcTreeElement().findLeafElementAt(offset);
107     return element != null ? element.getPsi() : null;
108   }
109 }