@NotNull FileASTNode.getLighterAST
[idea/community.git] / platform / core-impl / src / com / intellij / psi / impl / source / tree / FileElement.java
1 /*
2  * Copyright 2000-2015 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
17 package com.intellij.psi.impl.source.tree;
18
19 import com.intellij.lang.*;
20 import com.intellij.openapi.util.Getter;
21 import com.intellij.psi.PsiElement;
22 import com.intellij.psi.impl.PsiManagerEx;
23 import com.intellij.psi.impl.source.CharTableImpl;
24 import com.intellij.psi.impl.source.PsiFileImpl;
25 import com.intellij.psi.tree.IElementType;
26 import com.intellij.psi.tree.IFileElementType;
27 import com.intellij.psi.tree.ILightStubFileElementType;
28 import com.intellij.util.CharTable;
29 import org.jetbrains.annotations.NotNull;
30
31 public class FileElement extends LazyParseableElement implements FileASTNode, Getter<FileElement> {
32   public static final FileElement[] EMPTY_ARRAY = new FileElement[0];
33   private volatile CharTable myCharTable = new CharTableImpl();
34   private volatile boolean myDetached;
35
36   @Override
37   protected PsiElement createPsiNoLock() {
38     return myDetached ? null : super.createPsiNoLock();
39   }
40
41   public void detachFromFile() {
42     myDetached = true;
43     clearPsi();
44   }
45
46   @Override
47   @NotNull
48   public CharTable getCharTable() {
49     return myCharTable;
50   }
51
52   @NotNull
53   @Override
54   public LighterAST getLighterAST() {
55     final IFileElementType contentType = (IFileElementType)getElementType();
56     assert contentType instanceof ILightStubFileElementType:contentType; // method should not be called for such element types
57
58     if (!isParsed()) {
59       return new FCTSBackedLighterAST(getCharTable(), ((ILightStubFileElementType<?>)contentType).parseContentsLight(this));
60     }
61     return new TreeBackedLighterAST(this);
62   }
63
64   public FileElement(@NotNull IElementType type, CharSequence text) {
65     super(type, text);
66   }
67
68   @Deprecated  // for 8.1 API compatibility
69   public FileElement(IElementType type) {
70     super(type, null);
71   }
72
73   @Override
74   public PsiManagerEx getManager() {
75     CompositeElement treeParent = getTreeParent();
76     if (treeParent != null) return treeParent.getManager();
77     return (PsiManagerEx)getPsi().getManager(); //TODO: cache?
78   }
79
80   @Override
81   public ASTNode copyElement() {
82     PsiFileImpl psiElement = (PsiFileImpl)getPsi();
83     PsiFileImpl psiElementCopy = (PsiFileImpl)psiElement.copy();
84     return psiElementCopy.getTreeElement();
85   }
86
87   public void setCharTable(@NotNull CharTable table) {
88     myCharTable = table;
89   }
90
91   @Override
92   public FileElement get() {
93     return this;
94   }
95 }