From ad016e787eb096ff38d1fb19c3db325a531b7d02 Mon Sep 17 00:00:00 2001 From: Valentin Fondaratov Date: Wed, 15 Oct 2014 19:07:25 +0400 Subject: [PATCH] Fix bad behaviour of the LayeredLexer if a layer or delegate has the state of 2048 --- .../src/com/intellij/lexer/LayeredLexer.java | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/platform/core-api/src/com/intellij/lexer/LayeredLexer.java b/platform/core-api/src/com/intellij/lexer/LayeredLexer.java index 59149ceb236c..4b5606e146d7 100644 --- a/platform/core-api/src/com/intellij/lexer/LayeredLexer.java +++ b/platform/core-api/src/com/intellij/lexer/LayeredLexer.java @@ -16,7 +16,6 @@ package com.intellij.lexer; import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.util.Key; import com.intellij.psi.tree.IElementType; import com.intellij.util.containers.HashMap; import org.jetbrains.annotations.NotNull; @@ -97,7 +96,7 @@ public class LayeredLexer extends DelegateLexer { @Override public IElementType getTokenType() { - if (myState == IN_LAYER_LEXER_FINISHED_STATE) { + if (isInLayerEndGap()) { return myCurrentBaseTokenType; } return isLayerActive() ? myCurrentLayerLexer.getTokenType() : super.getTokenType(); @@ -105,7 +104,7 @@ public class LayeredLexer extends DelegateLexer { @Override public int getTokenStart() { - if (myState == IN_LAYER_LEXER_FINISHED_STATE) { + if (isInLayerEndGap()) { return myLayerLeftPart; } return isLayerActive() ? myCurrentLayerLexer.getTokenStart() : super.getTokenStart(); @@ -113,7 +112,7 @@ public class LayeredLexer extends DelegateLexer { @Override public int getTokenEnd() { - if (myState == IN_LAYER_LEXER_FINISHED_STATE) { + if (isInLayerEndGap()) { return myBaseTokenEnd; } return isLayerActive() ? myCurrentLayerLexer.getTokenEnd() : super.getTokenEnd(); @@ -121,7 +120,8 @@ public class LayeredLexer extends DelegateLexer { @Override public void advance() { - if (myState == IN_LAYER_LEXER_FINISHED_STATE){ + if (isInLayerEndGap()){ + myLayerLeftPart = -1; myState = super.getState(); return; } @@ -146,12 +146,12 @@ public class LayeredLexer extends DelegateLexer { // In case when we have non-covered gap we should return left part as next token if (tokenEnd != myBaseTokenEnd) { + myState = IN_LAYER_LEXER_FINISHED_STATE; + myLayerLeftPart = tokenEnd; if (LOG.isDebugEnabled()) { LOG.debug("We've got not covered gap from layered lexer: " + activeLayerLexer + "\n on token: " + getBufferSequence().subSequence(myLayerLeftPart, myBaseTokenEnd)); } - myState = IN_LAYER_LEXER_FINISHED_STATE; - myLayerLeftPart = tokenEnd; return; } } @@ -186,4 +186,8 @@ public class LayeredLexer extends DelegateLexer { private boolean isLayerActive() { return myCurrentLayerLexer != null; } + + private boolean isInLayerEndGap() { + return myLayerLeftPart != -1; + } }