lang-api
[idea/community.git] / platform / lang-api / src / com / intellij / psi / stubs / DefaultStubBuilder.java
1 /*
2  * @author max
3  */
4 package com.intellij.psi.stubs;
5
6 import com.intellij.psi.PsiElement;
7 import com.intellij.psi.PsiFile;
8 import com.intellij.psi.StubBasedPsiElement;
9 import com.intellij.psi.StubBuilder;
10
11 public class DefaultStubBuilder implements StubBuilder {
12   public StubElement buildStubTree(final PsiFile file) {
13     return buildStubTreeFor(file, createStubForFile(file));
14   }
15
16   protected StubElement createStubForFile(final PsiFile file) {
17     return new PsiFileStubImpl(file);
18   }
19
20   protected static StubElement buildStubTreeFor(PsiElement elt, StubElement parentStub) {
21     StubElement stub = parentStub;
22     if (elt instanceof StubBasedPsiElement) {
23       final IStubElementType type = ((StubBasedPsiElement)elt).getElementType();
24
25       if (type.shouldCreateStub(elt.getNode())) {
26         //noinspection unchecked
27         stub = type.createStub(elt, parentStub);
28       }
29     }
30
31     final PsiElement[] psiElements = elt.getChildren();
32     for (PsiElement child : psiElements) {
33       buildStubTreeFor(child, stub);
34     }
35
36     return stub;
37   }
38
39 }