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.kdoc.lexer;
018    
019    import com.intellij.lang.ASTNode;
020    import com.intellij.lang.PsiBuilder;
021    import com.intellij.lang.PsiBuilderFactory;
022    import com.intellij.lang.PsiParser;
023    import com.intellij.openapi.project.Project;
024    import com.intellij.psi.PsiElement;
025    import com.intellij.psi.tree.ILazyParseableElementType;
026    import com.intellij.psi.tree.TokenSet;
027    import org.jetbrains.annotations.Nullable;
028    import org.jetbrains.kotlin.idea.JetLanguage;
029    import org.jetbrains.kotlin.kdoc.parser.KDocLinkParser;
030    import org.jetbrains.kotlin.kdoc.parser.KDocParser;
031    import org.jetbrains.kotlin.kdoc.psi.impl.KDocImpl;
032    import org.jetbrains.kotlin.lexer.JetLexer;
033    
034    public interface KDocTokens {
035        ILazyParseableElementType KDOC = new ILazyParseableElementType("KDoc", JetLanguage.INSTANCE) {
036            @Override
037            public ASTNode parseContents(ASTNode chameleon) {
038                PsiElement parentElement = chameleon.getTreeParent().getPsi();
039                Project project = parentElement.getProject();
040                PsiBuilder builder = PsiBuilderFactory.getInstance().createBuilder(project, chameleon, new KDocLexer(), getLanguage(),
041                                                                                   chameleon.getText());
042                PsiParser parser = new KDocParser();
043    
044                return parser.parse(this, builder).getFirstChildNode();
045            }
046    
047            @Nullable
048            @Override
049            public ASTNode createNode(CharSequence text) {
050                return new KDocImpl(text);
051            }
052        };
053    
054        KDocToken START                 = new KDocToken("KDOC_START");
055        KDocToken END                   = new KDocToken("KDOC_END");
056        KDocToken LEADING_ASTERISK      = new KDocToken("KDOC_LEADING_ASTERISK");
057    
058        KDocToken TEXT                  = new KDocToken("KDOC_TEXT");
059    
060        /**
061         * First word following the tag name (@xxx). Depending on the tag name, this can be
062         * either a link (@param xxx) or just a plain text word (@since version).
063         * We understand which one it is during parsing.
064         */
065        KDocToken TEXT_OR_LINK          = new KDocToken("KDOC_TEXT_OR_LINK");
066        KDocToken TAG_NAME              = new KDocToken("KDOC_TAG_NAME");
067        ILazyParseableElementType MARKDOWN_LINK = new ILazyParseableElementType("KDOC_MARKDOWN_LINK", JetLanguage.INSTANCE) {
068            @Override
069            public ASTNode parseContents(ASTNode chameleon) {
070                PsiElement parentElement = chameleon.getTreeParent().getPsi();
071                Project project = parentElement.getProject();
072                PsiBuilder builder = PsiBuilderFactory.getInstance().createBuilder(project, chameleon, new JetLexer(), getLanguage(),
073                                                                                   chameleon.getText());
074                PsiParser parser = new KDocLinkParser();
075    
076                return parser.parse(this, builder).getFirstChildNode();
077            }
078        };
079    
080        KDocToken MARKDOWN_ESCAPED_CHAR = new KDocToken("KDOC_MARKDOWN_ESCAPED_CHAR");
081    
082        TokenSet KDOC_HIGHLIGHT_TOKENS = TokenSet.create(START, END, LEADING_ASTERISK, TEXT, MARKDOWN_LINK, MARKDOWN_ESCAPED_CHAR, TEXT_OR_LINK);
083        TokenSet CONTENT_TOKENS = TokenSet.create(TEXT, TAG_NAME, MARKDOWN_LINK, MARKDOWN_ESCAPED_CHAR, TEXT_OR_LINK);
084    }