diff --git a/platform/platform-api/src/com/intellij/lexer/LookAheadLexer.java b/platform/platform-api/src/com/intellij/lexer/LookAheadLexer.java index b388f6892c28..17c9bd6294d0 100644 --- a/platform/platform-api/src/com/intellij/lexer/LookAheadLexer.java +++ b/platform/platform-api/src/com/intellij/lexer/LookAheadLexer.java @@ -92,6 +92,10 @@ public abstract class LookAheadLexer extends LexerBase{ } } + public IElementType replaceCachedType(int index, IElementType token) { + return myTypeCache.set(index, token); + } + public int getState() { int offset = myTokenStart - myLastOffset; return myLastState | (offset << 16); diff --git a/platform/util/src/com/intellij/util/containers/Queue.java b/platform/util/src/com/intellij/util/containers/Queue.java index 0e2e81495ada..cf73a493e961 100644 --- a/platform/util/src/com/intellij/util/containers/Queue.java +++ b/platform/util/src/com/intellij/util/containers/Queue.java @@ -121,6 +121,23 @@ public class Queue { isWrapped = false; } + public T set(int index, T value) { + int arrayIndex; + if (isWrapped) { + if (myFirst + index >= myArray.length) { + arrayIndex = index - myArray.length + myFirst; + } + else + arrayIndex = myFirst + index; + } + else { + arrayIndex = myFirst + index; + } + final Object old = myArray[arrayIndex]; + myArray[arrayIndex] = value; + return (T)old; + } + public boolean process(@NotNull Processor processor) { if (isWrapped) { for (int i = myFirst; i < myArray.length; i++) { diff --git a/platform/util/testSrc/com/intellij/util/containers/QueueTest.java b/platform/util/testSrc/com/intellij/util/containers/QueueTest.java index aa9879ddee4d..98599b66978e 100644 --- a/platform/util/testSrc/com/intellij/util/containers/QueueTest.java +++ b/platform/util/testSrc/com/intellij/util/containers/QueueTest.java @@ -78,6 +78,29 @@ public class QueueTest extends TestCase { } } + public void testSetting() { + com.intellij.util.containers.Queue queue = new com.intellij.util.containers.Queue(10); + for (int i = 0; i < 9; i++) { + queue.addLast(String.valueOf(i)); + } + for (int i = 0; i < 4; i++) { + Object first = queue.pullFirst(); + queue.addLast(first); + } + + Assert.assertEquals(String.valueOf(4), queue.peekFirst()); + for (int i = 0; i < 5; i++) { + Assert.assertEquals(String.valueOf(i + 4), queue.set(i, String.valueOf(i*i))); + } + for (int i = 0; i < 4; i++) { + int k = i + 5; + Assert.assertEquals(String.valueOf(i), queue.set(k, String.valueOf(k*k))); + } + for (int i = 0; i < 9; i++) { + Assert.assertEquals(String.valueOf(i*i), queue.pullFirst()); + } + } + public void testCycling() { com.intellij.util.containers.Queue queue = new com.intellij.util.containers.Queue(10);