diff --git a/platform/lang-api/src/com/intellij/execution/filters/UrlFilter.java b/platform/lang-api/src/com/intellij/execution/filters/UrlFilter.java index c56df0be9f29..e654d130b65c 100644 --- a/platform/lang-api/src/com/intellij/execution/filters/UrlFilter.java +++ b/platform/lang-api/src/com/intellij/execution/filters/UrlFilter.java @@ -21,6 +21,7 @@ import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.util.io.URLUtil; import org.jetbrains.annotations.NotNull; @@ -35,7 +36,6 @@ import java.util.regex.Pattern; * @author yole */ public class UrlFilter implements Filter, DumbAware { - private static final String FILE_URL_PROTOCOL = "file://"; private final Project myProject; public UrlFilter() { @@ -52,7 +52,7 @@ public class UrlFilter implements Filter, DumbAware { if (!URLUtil.canContainUrl(line)) return null; int textStartOffset = entireLength - line.length(); - Pattern pattern = line.contains(URLUtil.FILE_PROTOCOL + URLUtil.SCHEME_SEPARATOR) ? URLUtil.FILE_URL_PATTERN : URLUtil.URL_PATTERN; + Pattern pattern = line.contains(LocalFileSystem.PROTOCOL_PREFIX) ? URLUtil.FILE_URL_PATTERN : URLUtil.URL_PATTERN; Matcher m = pattern.matcher(line); ResultItem item = null; List items = null; @@ -80,8 +80,28 @@ public class UrlFilter implements Filter, DumbAware { @Nullable private HyperlinkInfo buildFileHyperlinkInfo(@NotNull String url) { - if (myProject != null && url.startsWith(FILE_URL_PROTOCOL)) { - return new LazyFileHyperlinkInfo(myProject, StringUtil.trimStart(url, FILE_URL_PROTOCOL), 0, 0) { + if (myProject != null && url.startsWith(LocalFileSystem.PROTOCOL_PREFIX)) { + int documentLine = 0, documentColumn = 0; + int filePathEndIndex = url.length(); + final int lastColonInd = url.lastIndexOf(':'); + if (lastColonInd > LocalFileSystem.PROTOCOL_PREFIX.length() && lastColonInd < url.length() - 1) { + int lastValue = StringUtil.parseInt(url.substring(lastColonInd + 1), Integer.MIN_VALUE); + if (lastValue != Integer.MIN_VALUE) { + documentLine = lastValue - 1; + filePathEndIndex = lastColonInd; + int preLastColonInd = url.lastIndexOf(':', lastColonInd - 1); + if (preLastColonInd > LocalFileSystem.PROTOCOL_PREFIX.length()) { + int preLastValue = StringUtil.parseInt(url.substring(preLastColonInd + 1, lastColonInd), Integer.MIN_VALUE); + if (preLastValue != Integer.MIN_VALUE) { + documentLine = preLastValue - 1; + documentColumn = lastValue - 1; + filePathEndIndex = preLastColonInd; + } + } + } + } + String filePath = url.substring(LocalFileSystem.PROTOCOL_PREFIX.length(), filePathEndIndex); + return new LazyFileHyperlinkInfo(myProject, filePath, documentLine, documentColumn) { @Nullable @Override public OpenFileDescriptor getDescriptor() {