package com.siberika.idea.pascal.run; import com.intellij.execution.filters.AbstractFileHyperlinkFilter; import com.intellij.execution.filters.ConsoleFilterProvider; import com.intellij.execution.filters.FileHyperlinkRawData; import com.intellij.execution.filters.Filter; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.io.FileUtil; import com.siberika.idea.pascal.util.ModuleUtil; import kotlin.reflect.jvm.internal.impl.utils.SmartList; import org.apache.commons.lang.StringUtils; import org.jetbrains.annotations.NotNull; import java.util.Collections; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Author: George Bakhtadze * Date: 07/05/2017 */ public class HeaptrcConsoleFilterProvider implements ConsoleFilterProvider { private static final Pattern PATTERN_HEAPTRC = Pattern.compile("\\s*\\$[0-9A-F]+ (\\w+, )?line (\\d+) of (.+)\n?"); @NotNull @Override public Filter[] getDefaultFilters(@NotNull Project project) { if (ModuleUtil.hasPascalModules(project)) { return new Filter[]{ new AbstractFileHyperlinkFilter(project, FileUtil.expandUserHome("~/")) { @NotNull @Override public List<FileHyperlinkRawData> parse(@NotNull String line) { Matcher m = PATTERN_HEAPTRC.matcher(line); if (m.matches()) { List<FileHyperlinkRawData> res = new SmartList<FileHyperlinkRawData>(); String lineStr = m.group(2); int lineNum = !StringUtils.isEmpty(lineStr) ? Integer.parseInt(lineStr) - 1 : 0; res.add(new FileHyperlinkRawData(m.group(3), lineNum, 0, m.start(3), m.end(3))); return res; } else { return Collections.emptyList(); } } } }; } else { return new Filter[0]; } } }