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 }