Package com.dci.intellij.dbn.language.common

Source Code of com.dci.intellij.dbn.language.common.DBLanguageDialect

package com.dci.intellij.dbn.language.common;

import com.dci.intellij.dbn.language.common.element.ChameleonElementType;
import com.intellij.lang.LanguageDialect;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.tree.IFileElementType;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

public abstract class DBLanguageDialect extends LanguageDialect implements DBFileElementTypeProvider {
    private DBLanguageDialectIdentifier identifier;
    private DBLanguageSyntaxHighlighter syntaxHighlighter;
    private DBLanguageParserDefinition parserDefinition;
    private IFileElementType fileElementType;
    private Set<ChameleonTokenType> chameleonTokens;
    private ChameleonElementType chameleonElementType;
    private static Map<DBLanguageDialectIdentifier, DBLanguageDialect> register = new HashMap<DBLanguageDialectIdentifier, DBLanguageDialect>();
    private IElementType nestedRangeElementType;

    public DBLanguageDialect(@NonNls @NotNull DBLanguageDialectIdentifier identifier, @NotNull DBLanguage baseLanguage) {
        super(identifier.getValue(), baseLanguage);
        this.identifier = identifier;
        register.put(identifier, this);
    }

    protected abstract Set<ChameleonTokenType> createChameleonTokenTypes();
    protected abstract DBLanguageSyntaxHighlighter createSyntaxHighlighter() ;
    protected abstract DBLanguageParserDefinition createParserDefinition();
    protected abstract IFileElementType createFileElementType();
    public ChameleonElementType getChameleonTokenType(DBLanguageDialectIdentifier dialectIdentifier) {
        throw new IllegalArgumentException("Language " + getID() + " does not support chameleons of type " + dialectIdentifier.getValue() );
    }

    public static DBLanguageDialect getLanguageDialect(DBLanguageDialectIdentifier identifier) {
        return register.get(identifier);
    }

    public DBLanguageDialectIdentifier getIdentifier() {
        return identifier;
    }

    public boolean isReservedWord(String identifier) {
        return getParserTokenTypes().isReservedWord(identifier);
    }

    @NotNull
    public DBLanguage getBaseLanguage() {
        return (DBLanguage) super.getBaseLanguage();
    }

    public SharedTokenTypeBundle getSharedTokenTypes() {
        return getBaseLanguage().getSharedTokenTypes();
    }

    public synchronized DBLanguageSyntaxHighlighter getSyntaxHighlighter() {
        if (syntaxHighlighter == null) {
            syntaxHighlighter = createSyntaxHighlighter();
        }
        return syntaxHighlighter;
    }

    @NotNull
    public synchronized DBLanguageParserDefinition getParserDefinition() {
        if (parserDefinition == null) {
            parserDefinition = createParserDefinition();
        }
        return parserDefinition;
    }

    public synchronized IFileElementType getFileElementType() {
        if (fileElementType == null) {
            fileElementType = createFileElementType();
        }
        return fileElementType;
    }

    public TokenTypeBundle getParserTokenTypes() {
        return getParserDefinition().getParser().getTokenTypes();
    }

    public TokenTypeBundle getHighlighterTokenTypes() {
        return getSyntaxHighlighter().getTokenTypes();
    }

    public TokenType getInjectedLanguageToken(DBLanguageDialectIdentifier dialectIdentifier) {
        if (chameleonTokens == null) {
            chameleonTokens = createChameleonTokenTypes();
            if (chameleonTokens == null) chameleonTokens = new HashSet<ChameleonTokenType>();
        }
        for (ChameleonTokenType chameleonToken : chameleonTokens) {
            if (chameleonToken.getInjectedLanguage().getIdentifier() == dialectIdentifier) {
                return chameleonToken;
            }
        }
        return null;
    }

    public synchronized ChameleonElementType getChameleonElementType() {
        if (chameleonElementType == null) {
            chameleonElementType = new ChameleonElementType(this);
        }
        return chameleonElementType;
    }
}
TOP

Related Classes of com.dci.intellij.dbn.language.common.DBLanguageDialect

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.