我正在尝试使用编译模式来正确识别Dart中有错误的源文件。这是一个示例堆栈跟踪。
Illegal argument(s): Id has invalid characters sample.xmi
#0 Id.Id (package:ebisu/src/ebisu_id/id.dart:23:7)
#1 id (package:ebisu/src/ebisu_dart_meta/meta.dart:1104:22)
#2 library (package:ebisu/src/ebisu_dart_meta/meta.dart:1108:46)
#3 Converter.convert (file:///home/user/open_source/codegen/dart/xmi/lib/xmi_to_dart.dart:44:30)
#4 main (file:///home/user/open_source/codegen/dart/xmi/lib/xmi_to_dart.dart:164:20)
首先,我不确定使用最好的飞镖模式。我找到了这两个:
不确定推荐哪个?我试图使用第一个,但我没有看到任何与编译错误支持相关的内容。后者有一些东西,但它不匹配(可能已经过时,因为编译器消息/堆栈跟踪已经发展)。在这里,我尝试将这些行添加到第一个飞镖模式文件中:
(require 'compile)
(add-to-list 'compilation-error-regexp-alist 'dart)
(add-to-list 'compilation-error-regexp-alist-alist
'(dart "(file://\\([^:]*\\):\\([0-9]*\\):\\([0-9]*\\))" 1 2 3))
因此,这确实匹配列为'...(file:/// ...)'的行并正确跳转到错误。它(或其他一些表达式)错误地标识示例'...(package:ebisu / src / ...)'中的#0堆栈帧之类的行,并留下错误类型消息“在...中查找此错误“在迷你缓冲区中请求我输入要跳转的文件名。我想解决这个问题。所以,真的有两个问题,我不确定它是如何得到包的匹配,也许是其他一些匹配算法?第二,有没有办法匹配'#0'堆栈帧,以便它只查找当前目录(CWD)中的文件并处理文本
(package:ebisu/src/ebisu_id/id.dart:23:7)
相当于
(file://CWD/packages/ebisu/src/ebisu_id/id.dart:23:7)
其中CWD是用当前工作目录替换的文本吗?
答案 0 :(得分:1)
如果您将Emacs bug 11777中的补丁应用于compile.el,您应该可以执行以下操作:
(add-to-list 'compilation-error-regexp-alist 'dart-package)
(add-to-list 'compilation-error-regexp-alist-alist
'(dart-package "(package:\\([^:]*\\):\\([0-9]*\\):\\([0-9]*\\))"
(1 "packages/%s") 2 3))
compilation-error-regexp-alist
的文档字符串提到了这种格式字符串技巧,但如果没有补丁,它似乎无法正常工作。