diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/parsing/AbstractJetParsing.java b/compiler/frontend/src/org/jetbrains/jet/lang/parsing/AbstractJetParsing.java index b664c9edcc1..067840a6650 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/parsing/AbstractJetParsing.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/parsing/AbstractJetParsing.java @@ -17,6 +17,8 @@ package org.jetbrains.jet.lang.parsing; 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.TokenSet; import com.intellij.util.containers.Stack; @@ -31,7 +33,11 @@ import java.util.Map; import static org.jetbrains.jet.lexer.JetTokens.*; /*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 SOFT_KEYWORD_TEXTS = new HashMap(); + static { for (IElementType type : JetTokens.SOFT_KEYWORDS.getTypes()) { JetKeywordToken keywordToken = (JetKeywordToken) type; @@ -309,6 +315,7 @@ import static org.jetbrains.jet.lexer.JetTokens.*; protected int matchTokenStreamPredicate(TokenStreamPattern pattern) { PsiBuilder.Marker currentPosition = mark(); + int beginOffset = myBuilder.getCurrentOffset(); Stack opens = new Stack(); int openAngleBrackets = 0; int openBraces = 0; @@ -355,7 +362,19 @@ import static org.jetbrains.jet.lexer.JetTokens.*; } advance(); // skip token } + int endOffset = myBuilder.getCurrentOffset(); + 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(); }