001/* 002 * Copyright 2010-2013 JetBrains s.r.o. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 017package org.jetbrains.jet.lang.psi.stubs.elements; 018 019import com.intellij.lang.*; 020import com.intellij.openapi.project.Project; 021import com.intellij.psi.PsiElement; 022import com.intellij.psi.StubBuilder; 023import com.intellij.psi.stubs.IndexSink; 024import com.intellij.psi.stubs.StubElement; 025import com.intellij.psi.stubs.StubInputStream; 026import com.intellij.psi.stubs.StubOutputStream; 027import com.intellij.psi.tree.IStubFileElementType; 028import com.intellij.util.io.StringRef; 029import org.jetbrains.annotations.NonNls; 030import org.jetbrains.annotations.NotNull; 031import org.jetbrains.jet.lang.parsing.JetParser; 032import org.jetbrains.jet.lang.psi.stubs.PsiJetFileStub; 033import org.jetbrains.jet.lang.psi.stubs.impl.PsiJetFileStubImpl; 034import org.jetbrains.jet.plugin.JetLanguage; 035 036import java.io.IOException; 037 038public class JetFileElementType extends IStubFileElementType<PsiJetFileStub> { 039 public static final int STUB_VERSION = 23; 040 041 public JetFileElementType() { 042 super("jet.FILE", JetLanguage.INSTANCE); 043 } 044 045 protected JetFileElementType(@NonNls String debugName) { 046 super(debugName, JetLanguage.INSTANCE); 047 } 048 049 @Override 050 public StubBuilder getBuilder() { 051 return new JetFileStubBuilder(); 052 } 053 054 @Override 055 public int getStubVersion() { 056 return STUB_VERSION; 057 } 058 059 @Override 060 public String getExternalId() { 061 return "jet.FILE"; 062 } 063 064 @Override 065 public void serialize(PsiJetFileStub stub, StubOutputStream dataStream) 066 throws IOException { 067 dataStream.writeName(stub.getPackageName()); 068 dataStream.writeBoolean(stub.isScript()); 069 } 070 071 @Override 072 public PsiJetFileStub deserialize(StubInputStream dataStream, StubElement parentStub) throws IOException { 073 StringRef packName = dataStream.readName(); 074 boolean isScript = dataStream.readBoolean(); 075 return new PsiJetFileStubImpl(null, packName, isScript); 076 } 077 078 @Override 079 protected ASTNode doParseContents(@NotNull ASTNode chameleon, @NotNull PsiElement psi) { 080 Project project = psi.getProject(); 081 Language languageForParser = getLanguageForParser(psi); 082 PsiBuilder builder = PsiBuilderFactory.getInstance().createBuilder(project, chameleon, null, languageForParser, chameleon.getChars()); 083 JetParser parser = (JetParser) LanguageParserDefinitions.INSTANCE.forLanguage(languageForParser).createParser(project); 084 return parser.parse(this, builder, psi.getContainingFile()).getFirstChildNode(); 085 } 086 087 @Override 088 public void indexStub(PsiJetFileStub stub, IndexSink sink) { 089 StubIndexServiceFactory.getInstance().indexFile(stub, sink); 090 } 091}