From 4fa97c917d4c88bf52ce17efd708492b7ad472df Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Mon, 15 Dec 2014 14:10:04 +0300 Subject: [PATCH] Warn if lookahead is too big in matchTokenStreamPredicate() --- .../jet/lang/parsing/AbstractJetParsing.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) 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(); }