5652219361a7a7fbb8c1487e8f09450e55cab29c
[idea/community.git] / platform / core-impl / src / com / intellij / psi / DummyHolderViewProvider.java
1 /*
2  * Copyright 2000-2009 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.psi;
17
18 import com.intellij.lang.Language;
19 import com.intellij.openapi.fileTypes.UnknownFileType;
20 import com.intellij.openapi.vfs.VirtualFile;
21 import com.intellij.psi.impl.SharedPsiElementImplUtil;
22 import com.intellij.psi.impl.source.DummyHolder;
23 import com.intellij.psi.impl.source.tree.FileElement;
24 import com.intellij.psi.impl.source.tree.LeafElement;
25 import com.intellij.testFramework.LightVirtualFile;
26 import com.intellij.util.LocalTimeCounter;
27 import org.jetbrains.annotations.NotNull;
28 import org.jetbrains.annotations.Nullable;
29
30 import java.util.Collections;
31 import java.util.List;
32 import java.util.Set;
33
34 public class DummyHolderViewProvider extends AbstractFileViewProvider {
35   private DummyHolder myHolder;
36   private final long myModificationStamp;
37
38   public DummyHolderViewProvider(@NotNull PsiManager manager) {
39     super(manager, new LightVirtualFile("DummyHolder"), false, UnknownFileType.INSTANCE);
40     myModificationStamp = LocalTimeCounter.currentTime();
41   }
42
43   @Override
44   @NotNull
45   public CharSequence getContents() {
46     return myHolder != null ? myHolder.getNode().getText() : "";
47   }
48
49   @Override
50   @NotNull
51   public Language getBaseLanguage() {
52     return myHolder.getLanguage();
53   }
54
55   @Override
56   @NotNull
57   public Set<Language> getLanguages() {
58     return Collections.singleton(getBaseLanguage());
59   }
60
61   @Nullable
62   @Override
63   protected PsiFile getPsiInner(Language target) {
64     return getCachedPsi(target);
65   }
66
67   @Override
68   public PsiFile getCachedPsi(@NotNull Language target) {
69     getManager().getFileManager().setViewProvider(getVirtualFile(), this);
70     return target == getBaseLanguage() ? myHolder : null;
71   }
72
73   @NotNull
74   @Override
75   public List<PsiFile> getCachedPsiFiles() {
76     return Collections.singletonList(myHolder);
77   }
78
79   @NotNull
80   @Override
81   public List<FileElement> getKnownTreeRoots() {
82     return Collections.singletonList(myHolder.getTreeElement());
83   }
84
85   @Override
86   @NotNull
87   public List<PsiFile> getAllFiles() {
88     return getCachedPsiFiles();
89   }
90
91   @Override
92   public long getModificationStamp() {
93     return myModificationStamp;
94   }
95
96   public void setDummyHolder(@NotNull DummyHolder dummyHolder) {
97     myHolder = dummyHolder;
98     ((LightVirtualFile)getVirtualFile()).setFileType(dummyHolder.getFileType());
99   }
100
101   @Override
102   public PsiReference findReferenceAt(final int offset) {
103     return SharedPsiElementImplUtil.findReferenceAt(getPsi(getBaseLanguage()), offset);
104   }
105
106   @Override
107   public PsiElement findElementAt(int offset, @NotNull Class<? extends Language> lang) {
108     if (!lang.isAssignableFrom(getBaseLanguage().getClass())) return null;
109     return findElementAt(offset);
110   }
111
112   @NotNull
113   @Override
114   public FileViewProvider createCopy(@NotNull final VirtualFile copy) {
115     throw new RuntimeException("Clone is not supported for DummyHolderProviders. Use DummyHolder clone directly.");
116   }
117
118   @Override
119   public PsiElement findElementAt(final int offset) {
120     final LeafElement element = myHolder.calcTreeElement().findLeafElementAt(offset);
121     return element != null ? element.getPsi() : null;
122   }
123 }