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.KtNodeType;
034 import org.jetbrains.kotlin.KtNodeTypes;
035 import org.jetbrains.kotlin.idea.KotlinLanguage;
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.KotlinLexer;
040 import org.jetbrains.kotlin.lexer.KtTokens;
041 import org.jetbrains.kotlin.psi.KtFile;
042 import org.jetbrains.kotlin.psi.stubs.elements.KtStubElementType;
043 import org.jetbrains.kotlin.psi.stubs.elements.KtStubElementTypes;
044
045 public class KotlinParserDefinition 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 KotlinParserDefinition() {
050 //todo: ApplicationManager.getApplication() is null during JetParsingTest setting up
051
052 /*if (!ApplicationManager.getApplication().isCommandLine()) {
053 }*/
054 }
055
056 @NotNull
057 public static KotlinParserDefinition getInstance() {
058 return (KotlinParserDefinition)LanguageParserDefinitions.INSTANCE.forLanguage(KotlinLanguage.INSTANCE);
059 }
060
061 @Override
062 @NotNull
063 public Lexer createLexer(Project project) {
064 return new KotlinLexer();
065 }
066
067 @Override
068 public PsiParser createParser(Project project) {
069 return new KotlinParser(project);
070 }
071
072 @Override
073 public IFileElementType getFileNodeType() {
074 return KtStubElementTypes.FILE;
075 }
076
077 @Override
078 @NotNull
079 public TokenSet getWhitespaceTokens() {
080 return KtTokens.WHITESPACES;
081 }
082
083 @Override
084 @NotNull
085 public TokenSet getCommentTokens() {
086 return KtTokens.COMMENTS;
087 }
088
089 @Override
090 @NotNull
091 public TokenSet getStringLiteralElements() {
092 return KtTokens.STRINGS;
093 }
094
095 @Override
096 @NotNull
097 public PsiElement createElement(ASTNode astNode) {
098 IElementType elementType = astNode.getElementType();
099
100 if (elementType instanceof KtStubElementType) {
101 return ((KtStubElementType) elementType).createPsiFromAst(astNode);
102 }
103 else if (elementType == KtNodeTypes.TYPE_CODE_FRAGMENT ||
104 elementType == KtNodeTypes.EXPRESSION_CODE_FRAGMENT ||
105 elementType == KtNodeTypes.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 ((KtNodeType) elementType).createPsi(astNode);
116 }
117 }
118
119 @Override
120 public PsiFile createFile(FileViewProvider fileViewProvider) {
121 return new KtFile(fileViewProvider, false);
122 }
123
124 @Override
125 public SpaceRequirements spaceExistanceTypeBetweenTokens(ASTNode astNode, ASTNode astNode1) {
126 IElementType rightTokenType = astNode1.getElementType();
127 if (rightTokenType == KtTokens.GET_KEYWORD || rightTokenType == KtTokens.SET_KEYWORD) {
128 return SpaceRequirements.MUST_LINE_BREAK;
129 }
130 return SpaceRequirements.MAY;
131 }
132 }