diff --git a/idea/src/org/jetbrains/jet/plugin/filters/JetExceptionFilter.java b/idea/src/org/jetbrains/jet/plugin/filters/JetExceptionFilter.java index e7ad6ae92f5..d104579431b 100644 --- a/idea/src/org/jetbrains/jet/plugin/filters/JetExceptionFilter.java +++ b/idea/src/org/jetbrains/jet/plugin/filters/JetExceptionFilter.java @@ -23,6 +23,8 @@ import com.intellij.execution.filters.OpenFileHyperlinkInfo; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.search.GlobalSearchScope; +import kotlin.Function1; +import kotlin.KotlinPackage; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.psi.JetFile; @@ -35,11 +37,11 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; public class JetExceptionFilter implements Filter { - @NotNull private final ExceptionFilter exceptionFilter; - @NotNull private final GlobalSearchScope searchScope; + private final ExceptionFilter exceptionFilter; + private final GlobalSearchScope searchScope; public JetExceptionFilter(@NotNull GlobalSearchScope searchScope) { - exceptionFilter = new ExceptionFilter(searchScope); + this.exceptionFilter = new ExceptionFilter(searchScope); this.searchScope = searchScope; } @@ -56,7 +58,7 @@ public class JetExceptionFilter implements Filter { // fullyQualifiedName is of format "package.Class$Inner" String fullyQualifiedName = element.getClassName(); - // All classes except package classes and its inner classes are handled correctly in the default ExceptionFilter + // All classes except package classes and package parts are handled correctly in the default ExceptionFilter if (!isPackageClassOrSubClass(fullyQualifiedName)) { return null; } @@ -73,7 +75,7 @@ public class JetExceptionFilter implements Filter { return new OpenFileHyperlinkInfo(project, virtualFile, element.getLineNumber() - 1); } - private boolean isPackageClassOrSubClass(String fqName) { + private static boolean isPackageClassOrSubClass(String fqName) { if (fqName.equals(PackageClassUtils.getPackageClassName(FqName.ROOT))) { return true; } @@ -91,23 +93,31 @@ public class JetExceptionFilter implements Filter { private static final Pattern STACK_TRACE_ELEMENT_PATTERN = Pattern.compile("^\\s*at\\s+(.+)\\.(.+)\\((.+):(\\d+)\\)\\s*$"); @Nullable - private StackTraceElement parseStackTraceLine(@NotNull String line) { + private static StackTraceElement parseStackTraceLine(@NotNull String line) { Matcher matcher = STACK_TRACE_ELEMENT_PATTERN.matcher(line); if (matcher.matches()) { String declaringClass = matcher.group(1); String methodName = matcher.group(2); String fileName = matcher.group(3); - int lineNumber = Integer.parseInt(matcher.group(4)); - return new StackTraceElement(declaringClass, methodName, fileName, lineNumber); + String lineNumber = matcher.group(4); + //noinspection ConstantConditions + return new StackTraceElement(declaringClass, methodName, fileName, Integer.parseInt(lineNumber)); } return null; } @NotNull private Result patchResult(@NotNull Result result, @NotNull String line) { - HyperlinkInfo newHyperlinkInfo = createHyperlinkInfo(line); - return newHyperlinkInfo == null ? result : - new Result(result.highlightStartOffset, result.highlightEndOffset, newHyperlinkInfo, result.highlightAttributes); + final HyperlinkInfo newHyperlinkInfo = createHyperlinkInfo(line); + if (newHyperlinkInfo == null) return result; + + return new Result(KotlinPackage.map(result.getResultItems(), new Function1() { + @Override + public ResultItem invoke(ResultItem item) { + return new ResultItem(item.getHighlightStartOffset(), item.getHighlightEndOffset(), newHyperlinkInfo, + item.getHighlightAttributes()); + } + })); } @Nullable diff --git a/idea/src/org/jetbrains/jet/plugin/filters/JetExceptionFilterFactory.java b/idea/src/org/jetbrains/jet/plugin/filters/JetExceptionFilterFactory.java index 13bc12a44ab..a86dc7ac578 100644 --- a/idea/src/org/jetbrains/jet/plugin/filters/JetExceptionFilterFactory.java +++ b/idea/src/org/jetbrains/jet/plugin/filters/JetExceptionFilterFactory.java @@ -24,7 +24,7 @@ import org.jetbrains.annotations.NotNull; public class JetExceptionFilterFactory implements ExceptionFilterFactory { @NotNull @Override - public Filter create(GlobalSearchScope searchScope) { + public Filter create(@NotNull GlobalSearchScope searchScope) { return new JetExceptionFilter(searchScope); } } diff --git a/idea/tests/org/jetbrains/jet/plugin/filters/JetExceptionFilterTest.java b/idea/tests/org/jetbrains/jet/plugin/filters/JetExceptionFilterTest.java index d52d65a3b3a..8c5a5eab0c3 100644 --- a/idea/tests/org/jetbrains/jet/plugin/filters/JetExceptionFilterTest.java +++ b/idea/tests/org/jetbrains/jet/plugin/filters/JetExceptionFilterTest.java @@ -17,11 +17,12 @@ package org.jetbrains.jet.plugin.filters; import com.intellij.execution.filters.Filter; +import com.intellij.execution.filters.HyperlinkInfo; import com.intellij.execution.filters.OpenFileHyperlinkInfo; import com.intellij.openapi.editor.Document; import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.fileEditor.OpenFileDescriptor; -import com.intellij.openapi.vfs.VfsUtil; +import com.intellij.openapi.vfs.VfsUtilCore; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.search.GlobalSearchScope; @@ -36,10 +37,14 @@ import org.jetbrains.jet.utils.UtilsPackage; import java.io.File; public class JetExceptionFilterTest extends MultiFileTestCase { - private final JetExceptionFilterFactory jetExceptionFilterFactory = new JetExceptionFilterFactory(); - private VirtualFile rootDir; + @Override + protected void tearDown() throws Exception { + rootDir = null; + super.tearDown(); + } + @Override @NotNull protected String getTestDataPath() { @@ -61,12 +66,12 @@ public class JetExceptionFilterTest extends MultiFileTestCase { PsiDocumentManager.getInstance(myProject).commitAllDocuments(); } catch (Exception e) { - UtilsPackage.rethrow(e); + throw UtilsPackage.rethrow(e); } } @NotNull - private String createStackTraceElementLine(@NotNull String fileName, @NotNull String className, int lineNumber) { + private static String createStackTraceElementLine(@NotNull String fileName, @NotNull String className, int lineNumber) { // Method name doesn't matter String methodName = "foo"; @@ -83,18 +88,19 @@ public class JetExceptionFilterTest extends MultiFileTestCase { } assert rootDir != null; - Filter filter = jetExceptionFilterFactory.create(GlobalSearchScope.allScope(myProject)); + Filter filter = new JetExceptionFilterFactory().create(GlobalSearchScope.allScope(myProject)); String line = createStackTraceElementLine(fileName, className, lineNumber); Filter.Result result = filter.applyFilter(line, 0); assertNotNull(result); - assertInstanceOf(result.hyperlinkInfo, OpenFileHyperlinkInfo.class); - OpenFileHyperlinkInfo info = (OpenFileHyperlinkInfo) result.hyperlinkInfo; - OpenFileDescriptor descriptor = info.getDescriptor(); + HyperlinkInfo info = result.getFirstHyperlinkInfo(); + assertNotNull(info); + assertInstanceOf(info, OpenFileHyperlinkInfo.class); + OpenFileDescriptor descriptor = ((OpenFileHyperlinkInfo) info).getDescriptor(); assertNotNull(descriptor); - VirtualFile expectedFile = VfsUtil.findRelativeFile(fileName, rootDir); + VirtualFile expectedFile = VfsUtilCore.findRelativeFile(fileName, rootDir); assertNotNull(expectedFile); assertEquals(expectedFile, descriptor.getFile());