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.KotlinLanguage;
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    
033    public interface KDocTokens {
034        ILazyParseableElementType KDOC = new ILazyParseableElementType("KDoc", KotlinLanguage.INSTANCE) {
035            @Override
036            public ASTNode parseContents(ASTNode chameleon) {
037                PsiElement parentElement = chameleon.getTreeParent().getPsi();
038                Project project = parentElement.getProject();
039                PsiBuilder builder = PsiBuilderFactory.getInstance().createBuilder(project, chameleon, new KDocLexer(), getLanguage(),
040                                                                                   chameleon.getText());
041                PsiParser parser = new KDocParser();
042    
043                return parser.parse(this, builder).getFirstChildNode();
044            }
045    
046            @Nullable
047            @Override
048            public ASTNode createNode(CharSequence text) {
049                return new KDocImpl(text);
050            }
051        };
052    
053        KDocToken START                 = new KDocToken("KDOC_START");
054        KDocToken END                   = new KDocToken("KDOC_END");
055        KDocToken LEADING_ASTERISK      = new KDocToken("KDOC_LEADING_ASTERISK");
056    
057        KDocToken TEXT                  = new KDocToken("KDOC_TEXT");
058    
059        KDocToken TAG_NAME              = new KDocToken("KDOC_TAG_NAME");
060        ILazyParseableElementType MARKDOWN_LINK = new ILazyParseableElementType("KDOC_MARKDOWN_LINK", KotlinLanguage.INSTANCE) {
061            @Override
062            public ASTNode parseContents(ASTNode chameleon) {
063                return KDocLinkParser.parseMarkdownLink(this, chameleon);
064            }
065        };
066    
067        KDocToken MARKDOWN_ESCAPED_CHAR = new KDocToken("KDOC_MARKDOWN_ESCAPED_CHAR");
068        KDocToken MARKDOWN_INLINE_LINK = new KDocToken("KDOC_MARKDOWN_INLINE_LINK");
069    
070        TokenSet KDOC_HIGHLIGHT_TOKENS = TokenSet.create(START, END, LEADING_ASTERISK, TEXT, MARKDOWN_LINK, MARKDOWN_ESCAPED_CHAR, MARKDOWN_INLINE_LINK);
071        TokenSet CONTENT_TOKENS = TokenSet.create(TEXT, TAG_NAME, MARKDOWN_LINK, MARKDOWN_ESCAPED_CHAR, MARKDOWN_INLINE_LINK);
072    }