A temporary fix for the whitespace problem (each marker is wrapped, this is costly)

This commit is contained in:
Andrey Breslav
2010-12-30 13:45:17 +03:00
parent aaa3e9e1c2
commit fb13e1b14f
2 changed files with 82 additions and 0 deletions
@@ -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);
}
}
@@ -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;
}
};
}
}