001    /*
002     * Copyright 2010-2015 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    
017    package org.jetbrains.kotlin.parsing;
018    
019    import com.intellij.extapi.psi.ASTWrapperPsiElement;
020    import com.intellij.lang.ASTNode;
021    import com.intellij.lang.LanguageParserDefinitions;
022    import com.intellij.lang.ParserDefinition;
023    import com.intellij.lang.PsiParser;
024    import com.intellij.lexer.Lexer;
025    import com.intellij.openapi.project.Project;
026    import com.intellij.psi.FileViewProvider;
027    import com.intellij.psi.PsiElement;
028    import com.intellij.psi.PsiFile;
029    import com.intellij.psi.tree.IElementType;
030    import com.intellij.psi.tree.IFileElementType;
031    import com.intellij.psi.tree.TokenSet;
032    import org.jetbrains.annotations.NotNull;
033    import org.jetbrains.kotlin.JetNodeType;
034    import org.jetbrains.kotlin.JetNodeTypes;
035    import org.jetbrains.kotlin.idea.JetLanguage;
036    import org.jetbrains.kotlin.kdoc.lexer.KDocTokens;
037    import org.jetbrains.kotlin.kdoc.parser.KDocElementType;
038    import org.jetbrains.kotlin.kdoc.psi.impl.KDocLink;
039    import org.jetbrains.kotlin.lexer.JetLexer;
040    import org.jetbrains.kotlin.lexer.JetTokens;
041    import org.jetbrains.kotlin.psi.JetFile;
042    import org.jetbrains.kotlin.psi.stubs.elements.JetStubElementType;
043    import org.jetbrains.kotlin.psi.stubs.elements.JetStubElementTypes;
044    
045    public class JetParserDefinition implements ParserDefinition {
046        public static final String STD_SCRIPT_SUFFIX = "kts";
047        public static final String STD_SCRIPT_EXT = "." + STD_SCRIPT_SUFFIX;
048    
049        public JetParserDefinition() {
050            //todo: ApplicationManager.getApplication() is null during JetParsingTest setting up
051    
052            /*if (!ApplicationManager.getApplication().isCommandLine()) {
053            }*/
054        }
055    
056        @NotNull
057        public static JetParserDefinition getInstance() {
058            return (JetParserDefinition)LanguageParserDefinitions.INSTANCE.forLanguage(JetLanguage.INSTANCE);
059        }
060    
061        @Override
062        @NotNull
063        public Lexer createLexer(Project project) {
064            return new JetLexer();
065        }
066    
067        @Override
068        public PsiParser createParser(Project project) {
069            return new JetParser(project);
070        }
071    
072        @Override
073        public IFileElementType getFileNodeType() {
074            return JetStubElementTypes.FILE;
075        }
076    
077        @Override
078        @NotNull
079        public TokenSet getWhitespaceTokens() {
080            return JetTokens.WHITESPACES;
081        }
082    
083        @Override
084        @NotNull
085        public TokenSet getCommentTokens() {
086            return JetTokens.COMMENTS;
087        }
088    
089        @Override
090        @NotNull
091        public TokenSet getStringLiteralElements() {
092            return JetTokens.STRINGS;
093        }
094    
095        @Override
096        @NotNull
097        public PsiElement createElement(ASTNode astNode) {
098            IElementType elementType = astNode.getElementType();
099    
100            if (elementType instanceof JetStubElementType) {
101                return ((JetStubElementType) elementType).createPsiFromAst(astNode);
102            }
103            else if (elementType == JetNodeTypes.TYPE_CODE_FRAGMENT ||
104                     elementType == JetNodeTypes.EXPRESSION_CODE_FRAGMENT  ||
105                     elementType == JetNodeTypes.BLOCK_CODE_FRAGMENT) {
106                return new ASTWrapperPsiElement(astNode);
107            }
108            else if (elementType instanceof KDocElementType) {
109                return ((KDocElementType) elementType).createPsi(astNode);
110            }
111            else if (elementType == KDocTokens.MARKDOWN_LINK) {
112                return new KDocLink(astNode);
113            }
114            else {
115                return ((JetNodeType) elementType).createPsi(astNode);
116            }
117        }
118    
119        @Override
120        public PsiFile createFile(FileViewProvider fileViewProvider) {
121            return new JetFile(fileViewProvider, false);
122        }
123    
124        @Override
125        public SpaceRequirements spaceExistanceTypeBetweenTokens(ASTNode astNode, ASTNode astNode1) {
126            return SpaceRequirements.MAY;
127        }
128    }