Warn if lookahead is too big in matchTokenStreamPredicate()
This commit is contained in:
@@ -17,6 +17,8 @@
|
|||||||
package org.jetbrains.jet.lang.parsing;
|
package org.jetbrains.jet.lang.parsing;
|
||||||
|
|
||||||
import com.intellij.lang.PsiBuilder;
|
import com.intellij.lang.PsiBuilder;
|
||||||
|
import com.intellij.openapi.application.ApplicationManager;
|
||||||
|
import com.intellij.openapi.diagnostic.Logger;
|
||||||
import com.intellij.psi.tree.IElementType;
|
import com.intellij.psi.tree.IElementType;
|
||||||
import com.intellij.psi.tree.TokenSet;
|
import com.intellij.psi.tree.TokenSet;
|
||||||
import com.intellij.util.containers.Stack;
|
import com.intellij.util.containers.Stack;
|
||||||
@@ -31,7 +33,11 @@ import java.util.Map;
|
|||||||
import static org.jetbrains.jet.lexer.JetTokens.*;
|
import static org.jetbrains.jet.lexer.JetTokens.*;
|
||||||
|
|
||||||
/*package*/ abstract class AbstractJetParsing {
|
/*package*/ abstract class AbstractJetParsing {
|
||||||
|
private static final Logger LOGGER = Logger.getInstance(AbstractJetParsing.class);
|
||||||
|
private static final int LOOK_AHEAD_SIZE_WARN = 1000;
|
||||||
|
|
||||||
private static final Map<String, JetKeywordToken> SOFT_KEYWORD_TEXTS = new HashMap<String, JetKeywordToken>();
|
private static final Map<String, JetKeywordToken> SOFT_KEYWORD_TEXTS = new HashMap<String, JetKeywordToken>();
|
||||||
|
|
||||||
static {
|
static {
|
||||||
for (IElementType type : JetTokens.SOFT_KEYWORDS.getTypes()) {
|
for (IElementType type : JetTokens.SOFT_KEYWORDS.getTypes()) {
|
||||||
JetKeywordToken keywordToken = (JetKeywordToken) type;
|
JetKeywordToken keywordToken = (JetKeywordToken) type;
|
||||||
@@ -309,6 +315,7 @@ import static org.jetbrains.jet.lexer.JetTokens.*;
|
|||||||
|
|
||||||
protected int matchTokenStreamPredicate(TokenStreamPattern pattern) {
|
protected int matchTokenStreamPredicate(TokenStreamPattern pattern) {
|
||||||
PsiBuilder.Marker currentPosition = mark();
|
PsiBuilder.Marker currentPosition = mark();
|
||||||
|
int beginOffset = myBuilder.getCurrentOffset();
|
||||||
Stack<IElementType> opens = new Stack<IElementType>();
|
Stack<IElementType> opens = new Stack<IElementType>();
|
||||||
int openAngleBrackets = 0;
|
int openAngleBrackets = 0;
|
||||||
int openBraces = 0;
|
int openBraces = 0;
|
||||||
@@ -355,7 +362,19 @@ import static org.jetbrains.jet.lexer.JetTokens.*;
|
|||||||
}
|
}
|
||||||
advance(); // skip token
|
advance(); // skip token
|
||||||
}
|
}
|
||||||
|
int endOffset = myBuilder.getCurrentOffset();
|
||||||
|
|
||||||
currentPosition.rollbackTo();
|
currentPosition.rollbackTo();
|
||||||
|
|
||||||
|
if (endOffset - beginOffset > LOOK_AHEAD_SIZE_WARN && !ApplicationManager.getApplication().isHeadlessEnvironment()) {
|
||||||
|
String text = new StringBuilder(myBuilder.getOriginalText())
|
||||||
|
.insert(endOffset, "<~~!END!~~>")
|
||||||
|
.insert(beginOffset, "<~~!BEGIN!~~>")
|
||||||
|
.toString();
|
||||||
|
|
||||||
|
LOGGER.warn("Suspicious big range: \n" + text);
|
||||||
|
}
|
||||||
|
|
||||||
return pattern.result();
|
return pattern.result();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user