From 528b3a1e73fc97c2b3b97fcb637f40f09694d3b0 Mon Sep 17 00:00:00 2001 From: "Maxim.Mossienko" Date: Thu, 2 Feb 2017 18:50:54 +0100 Subject: [PATCH] If SOE encountered when do reg exp matching then ignore the exception and return result (temp fix for IDEA-150928) --- .../intellij/find/impl/FindManagerTest.java | 12 +++++++ .../intellij/find/impl/FindManagerImpl.java | 36 ++++++++++--------- 2 files changed, 32 insertions(+), 16 deletions(-) diff --git a/java/java-tests/testSrc/com/intellij/find/impl/FindManagerTest.java b/java/java-tests/testSrc/com/intellij/find/impl/FindManagerTest.java index a9493f733593..4e88ccfb3563 100644 --- a/java/java-tests/testSrc/com/intellij/find/impl/FindManagerTest.java +++ b/java/java-tests/testSrc/com/intellij/find/impl/FindManagerTest.java @@ -909,6 +909,18 @@ public class FindManagerTest extends DaemonAnalyzerTestCase { assertTrue(condition.value("makefile")); } + public void testRegExpSOEWhenMatch() throws InterruptedException { + String text = "package com.intellij.demo;\n" + + "\n"; + for(int i = 0; i < 10; ++i) text += text; + + FindModel findModel = FindManagerTestUtils.configureFindModel(";((?:\\n|.)*export default )(?:DS.Model)(.extend((?:\\n|.)*assets: DS.attr(?:\\n|.)*});)"); + findModel.setRegularExpressions(true); + + FindResult findResult = myFindManager.findString(text, 0, findModel, null); + assertTrue(!findResult.isStringFound()); + } + public void testRegExpSearchDoesCheckCancelled() throws InterruptedException { String text = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; FindModel findModel = FindManagerTestUtils.configureFindModel("(x+x+)+y"); diff --git a/platform/lang-impl/src/com/intellij/find/impl/FindManagerImpl.java b/platform/lang-impl/src/com/intellij/find/impl/FindManagerImpl.java index 1f9b4a54c4ff..4209077af697 100644 --- a/platform/lang-impl/src/com/intellij/find/impl/FindManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/find/impl/FindManagerImpl.java @@ -777,25 +777,29 @@ public class FindManagerImpl extends FindManager { if (matcher == null) { return NOT_FOUND_RESULT; } - if (model.isForward()){ - if (matcher.find(startOffset)) { - if (matcher.end() <= text.length()) { - return new FindResultImpl(matcher.start(), matcher.end()); + try { + if (model.isForward()) { + if (matcher.find(startOffset)) { + if (matcher.end() <= text.length()) { + return new FindResultImpl(matcher.start(), matcher.end()); + } } - } - return NOT_FOUND_RESULT; - } - else { - int start = -1; - int end = -1; - while(matcher.find() && matcher.end() < startOffset){ - start = matcher.start(); - end = matcher.end(); - } - if (start < 0){ return NOT_FOUND_RESULT; } - return new FindResultImpl(start, end); + else { + int start = -1; + int end = -1; + while (matcher.find() && matcher.end() < startOffset) { + start = matcher.start(); + end = matcher.end(); + } + if (start < 0) { + return NOT_FOUND_RESULT; + } + return new FindResultImpl(start, end); + } + } catch (StackOverflowError soe) { + return NOT_FOUND_RESULT; } }