Package com.intellij.coldFusion.model.lexer

Source Code of com.intellij.coldFusion.model.lexer.CfmlLexer

/*
* Copyright 2000-2013 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.coldFusion.model.lexer;

import com.intellij.coldFusion.model.parsers.CfmlElementTypes;
import com.intellij.lexer.FlexAdapter;
import com.intellij.lexer.Lexer;
import com.intellij.lexer.MergingLexerAdapter;
import com.intellij.openapi.project.Project;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.tree.TokenSet;

/**
* Created by Lera Nikolaenko
* Date: 06.10.2008
*/
/*
public class CfmlLexer extends LexerBase {
    protected static final int NONINITIAL_STATE = 1000;
    private Lexer myOriginal;
    private Lexer myCfscriptLexer = null;

    public CfmlLexer(boolean highlightingMode) {
        myOriginal = new FlexAdapter(new _CfmlLexer());
    }

    public char[] getBuffer(){
      return myOriginal.getBuffer();
    }

    public int getBufferEnd(){
      return myOriginal.getBufferEnd();
    }

    public void start(char[] buffer, int startOffset, int endOffset, int initialState) {
        myOriginal.start(buffer, startOffset, endOffset, initialState & 0xFFFF);    //Overriden method. Auto insertion
        if (isCurrentTokenIsScriptToken()) {
            startScriptLexer(buffer, startOffset, endOffset, initialState >> 16);
        }
    }

    public int getState() {
        return NONINITIAL_STATE;
        /*
        if (myCfscriptLexer == null) {
            return myOriginal.getState() & 0xFFFF;
        } else {
            return myCfscriptLexer.getState() << 16 | myOriginal.getState() & 0xFFFF;
        }
        */
/*    }

    public IElementType getTokenType() {
        if (myCfscriptLexer != null) {
            return myCfscriptLexer.getTokenType();
        }
        return myOriginal.getTokenType();
    }

    public int getTokenStart() {
        if (myCfscriptLexer != null) {
            return myCfscriptLexer.getTokenStart();
        }
        return myOriginal.getTokenStart();
    }

    public int getTokenEnd() {
        if (myCfscriptLexer != null) {
            return myCfscriptLexer.getTokenEnd();
        }
        return myOriginal.getTokenEnd();
    }

    public void advance() {
        if (myCfscriptLexer == null) {
            myOriginal.advance();
            if (myOriginal.getTokenType() == CfmlElementTypes.CF_SCRIPT ||
                    myOriginal.getTokenType() == CfmlTokenTypes.SCRIPT_EXPRESSION) {
                startScriptLexer(super.getBufferSequence(), myOriginal.getTokenStart(), myOriginal.getBufferEnd(), 0);
            }
        } else {
            int end1 = myOriginal.getTokenEnd();
            int end2 = myCfscriptLexer.getTokenEnd();
            int myCurOffset = Math.min(end1, end2);

            if (myCurOffset == end2){
              myCfscriptLexer.advance();
            }

            if (myCurOffset == end1){
              myOriginal.advance();
              if (!isCurrentTokenIsScriptToken()) {
                  myCfscriptLexer = null;
              }
            }
        }
    }

    private void startScriptLexer(char[] buffer, int startOffset, int endOffset, int initialState) {
        if (myOriginal.getTokenType() == CfmlElementTypes.CF_SCRIPT ||
                myOriginal.getTokenType() == CfmlTokenTypes.SCRIPT_EXPRESSION) {
            int endPosition = endOffset;//getEndOfScript();
            // TODO not to create it every time!!!!! Hash!
            myCfscriptLexer = new CfscriptLexer(false);//new CfscriptHighlighter.CfscriptFileHighlighter().getHighlightingLexer();
            myCfscriptLexer.start(buffer, startOffset, Math.min(endPosition, endOffset), initialState >> 16);
        }
    }

    private void startScriptLexer(CharSequence buffer, int startOffset, int endOffset, int initialState) {
        if (myOriginal.getTokenType() == CfmlElementTypes.CF_SCRIPT ||
                myOriginal.getTokenType() == CfmlTokenTypes.SCRIPT_EXPRESSION) {
            int endPosition = endOffset;//getEndOfScript();
            // TODO not to create it every time!!!!! Hash!
            myCfscriptLexer = new CfscriptLexer(false);//new CfscriptHighlighter.CfscriptFileHighlighter().getHighlightingLexer();
            if (endOffset > 0) {
                endPosition = Math.min(endPosition, endOffset);
            }
            myCfscriptLexer.start(buffer, startOffset, endPosition, initialState >> 16);
        }
    }

    public boolean isCurrentTokenIsScriptToken() {
        return myOriginal.getTokenType() == CfmlElementTypes.CF_SCRIPT ||
                myOriginal.getTokenType() == CfmlTokenTypes.SCRIPT_EXPRESSION;
    }

    private class myLexerPosition implements LexerPosition {
        private Object myCfmlConfig;
        private Object myCfscriptConfig;
        private int myOffset;
        private int myState;

        protected myLexerPosition(Object myCfmlConfig, Object myCfscriptConfig, int myOffset, int myState) {
            this.myCfmlConfig = myCfmlConfig;
            this.myCfscriptConfig = myCfscriptConfig;
            this.myOffset = myOffset;
            this.myState = myState;
        }
       
        public int getOffset() {
            return myOffset;
        }

        public int getState() {
            return myState;
        }
    }

    @Override
    public LexerPosition getCurrentPosition() {
        final int offset = getTokenStart();
        final int state = getState();
        return new LexerPosition () {
            public int getOffset() {
                return offset;
            }

            public int getState() {
                return state;
            }
        };
    }

    @Override
    public void restore(LexerPosition position) {
        super.start(super.getBufferSequence(), position.getOffset(), myOriginal.getBufferEnd(),
                position.getState() & 0xFFFF);
       
        if (isCurrentTokenIsScriptToken()) {
            startScriptLexer(super.getBufferSequence(), position.getOffset(), myOriginal.getBufferEnd(),
                position.getState() >> 16);
        }
    }

    /*
    @Override
    public Lexer getOriginal() {
        if (myCfscriptLexer == null) {
            return myOriginal;
        }
        return myCfscriptLexer;
    }

    /*

    private static final TokenSet TOKENS_TO_MERGE =
            TokenSet.create(CfmlTokenTypes.COMMENT,
                    CfmlTokenTypes.WHITE_SPACE,
                    CfmlTokenTypes.SCRIPT_EXPRESSION);
   */
/*
}
*/
public class CfmlLexer extends MergingLexerAdapter {
  private Lexer myCfscriptLexer = null;
  private int myStartPosition = 0;
  private Project myProject;

  private static final TokenSet TOKENS_TO_MERGE =
    TokenSet.create(CfmlTokenTypes.COMMENT,
                    CfmlTokenTypes.WHITE_SPACE,
                    CfmlTokenTypes.SCRIPT_EXPRESSION, CfmlElementTypes.TEMPLATE_TEXT);

  public CfmlLexer(boolean highlightingMode, Project project) {
    super(new FlexAdapter(new _CfmlLexer(project)), TOKENS_TO_MERGE);
    myProject = project;
  }

  @Override
  public int getState() {
    return 1000;
  }

  @Override
  public void advance() {
    if (myCfscriptLexer != null) {
            /*
            if (myStateToReturn == START_EXPRESSION) {
                myStateToReturn = ORIGINAL;
            }
            */
      myCfscriptLexer.advance();
      if (myCfscriptLexer.getTokenType() == null) {
        myCfscriptLexer = null;
        // myStateToReturn = END_EXPRESSION;
      }
    }
    else {
            /*
            if (myStateToReturn == END_EXPRESSION) {
                myStateToReturn = ORIGINAL;
            }
            */
      super.advance();
    }
  }

  @Override
  public IElementType getTokenType() {

    if (myCfscriptLexer != null) {
      return myCfscriptLexer.getTokenType();
    }
    if (super.getTokenType() == CfmlElementTypes.CF_SCRIPT ||
        super.getTokenType() == CfmlTokenTypes.SCRIPT_EXPRESSION) {
      // myStateToReturn = START_EXPRESSION;
      final int startPosition = super.getTokenStart();
      myStartPosition = startPosition;
      int endPosition = super.getTokenEnd();
      while (super.getTokenType() == CfmlTokenTypes.SCRIPT_EXPRESSION ||
             super.getTokenType() == CfmlElementTypes.CF_SCRIPT) {
        endPosition = super.getTokenEnd();
        super.advance();
      }
      myCfscriptLexer = new CfscriptLexer(myProject);//new CfscriptHighlighter.CfscriptFileHighlighter().getHighlightingLexer();
      myCfscriptLexer.start(super.getBufferSequence().subSequence(startPosition, endPosition),
                            0, endPosition - startPosition, myCfscriptLexer.getState());
      return myCfscriptLexer.getTokenType();
    }
    return super.getTokenType();
  }

  @Override
  public int getTokenStart() {
    if (myCfscriptLexer != null) {
      return myCfscriptLexer.getTokenStart() + myStartPosition;
    }
    return super.getTokenStart();
  }

  @Override
  public int getTokenEnd() {
        /*
        if (myStateToReturn != ORIGINAL) {
            return getTokenStart();
        }
        */
    if (myCfscriptLexer != null) {
      return myCfscriptLexer.getTokenEnd() + myStartPosition;
    }
    return super.getTokenEnd();
  }
}
TOP

Related Classes of com.intellij.coldFusion.model.lexer.CfmlLexer

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.