如何在编译模式下从包跳转到堆栈跟踪错误



我试图获得编译模式以正确识别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)

首先,我不确定使用哪种省略式最好。我找到了这两个:

  • https://github.com/nex3/dart-mode/blob/master/dart-mode.el
  • http://dart.googlecode.com/svn/trunk/dart/tools/utils/elisp/dart-mode.el

不确定推荐哪个?我正在尝试使用第一个,但我没有看到任何与编译错误支持相关的内容。后者有它的一些东西,但它不匹配(可能过时,因为编译器消息/堆栈跟踪已经发展)。在这里,在我的尝试中,我将这些行添加到第一个省道模式文件中:

(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堆栈帧这样的行,并在minibuffer中留下错误类型消息"在…中查找此错误",要求我输入要跳转到的文件名。我想解决这个问题。两个问题,我不确定它是如何得到匹配包的,也许是其他匹配算法?第二,是否有一种方法来匹配'#0'堆栈帧,使它只在当前目录(CWD)中查找文件并处理文本

(package:ebisu/src/ebisu_id/id.dart:23:7) 

作为

的等价
(file://CWD/packages/ebisu/src/ebisu_id/id.dart:23:7)

其中CWD文本替换为当前工作目录?

如果您在Emacs中应用补丁,错误11777编译。因此,您应该能够执行以下操作:

(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的文档字符串提到了这个格式字符串技巧,但如果没有补丁,它似乎无法正常工作。

最新更新