From fb13e1b14f5c665c771f367b5c81f6a9f78422e0 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Thu, 30 Dec 2010 13:45:17 +0300 Subject: [PATCH] A temporary fix for the whitespace problem (each marker is wrapped, this is costly) --- .../jet/lang/parsing/MarkerAdapter.java | 68 +++++++++++++++++++ ...SemanticWhitespaceAwarePsiBuilderImpl.java | 14 ++++ 2 files changed, 82 insertions(+) create mode 100644 idea/src/org/jetbrains/jet/lang/parsing/MarkerAdapter.java diff --git a/idea/src/org/jetbrains/jet/lang/parsing/MarkerAdapter.java b/idea/src/org/jetbrains/jet/lang/parsing/MarkerAdapter.java new file mode 100644 index 00000000000..2a0f04316cb --- /dev/null +++ b/idea/src/org/jetbrains/jet/lang/parsing/MarkerAdapter.java @@ -0,0 +1,68 @@ +package org.jetbrains.jet.lang.parsing; + +import com.intellij.lang.PsiBuilder; +import com.intellij.lang.WhitespacesAndCommentsBinder; +import com.intellij.psi.tree.IElementType; +import org.jetbrains.annotations.Nullable; + +/** + * @author abreslav + */ +public class MarkerAdapter implements PsiBuilder.Marker { + + private final PsiBuilder.Marker delegate; + + public MarkerAdapter(PsiBuilder.Marker delegate) { + this.delegate = delegate; + } + + @Override + public PsiBuilder.Marker precede() { + return delegate.precede(); + } + + @Override + public void drop() { + delegate.drop(); + } + + @Override + public void rollbackTo() { + delegate.rollbackTo(); + } + + @Override + public void done(IElementType type) { + delegate.done(type); + } + + @Override + public void collapse(IElementType type) { + delegate.collapse(type); + } + + @Override + public void doneBefore(IElementType type, PsiBuilder.Marker before) { + delegate.doneBefore(type, before); + } + + @Override + public void doneBefore(IElementType type, PsiBuilder.Marker before, String errorMessage) { + delegate.doneBefore(type, before, errorMessage); + } + + @Override + public void error(String message) { + delegate.error(message); + } + + @Override + public void errorBefore(String message, PsiBuilder.Marker before) { + delegate.errorBefore(message, before); + } + + @Override + public void setCustomEdgeTokenBinders(@Nullable WhitespacesAndCommentsBinder left, @Nullable WhitespacesAndCommentsBinder right) { + delegate.setCustomEdgeTokenBinders(left, right); + } +} diff --git a/idea/src/org/jetbrains/jet/lang/parsing/SemanticWhitespaceAwarePsiBuilderImpl.java b/idea/src/org/jetbrains/jet/lang/parsing/SemanticWhitespaceAwarePsiBuilderImpl.java index aff01968388..29edce42e3f 100644 --- a/idea/src/org/jetbrains/jet/lang/parsing/SemanticWhitespaceAwarePsiBuilderImpl.java +++ b/idea/src/org/jetbrains/jet/lang/parsing/SemanticWhitespaceAwarePsiBuilderImpl.java @@ -39,4 +39,18 @@ public class SemanticWhitespaceAwarePsiBuilderImpl extends PsiBuilderAdapter imp public boolean eolInLastWhitespace() { return myEOLInLastWhitespace || eof(); } + + // TODO: Overhead + @Override + public Marker mark() { + return new MarkerAdapter(super.mark()) { + private final boolean eolInLastWhitespace = eolInLastWhitespace(); + + @Override + public void rollbackTo() { + super.rollbackTo(); + myEOLInLastWhitespace = eolInLastWhitespace; + } + }; + } }