MUnit和MCover“无效的包...应该<empty>”错误

时间:2016-04-29 04:30:33

标签: compiler-errors package haxe haxeflixel

尝试使用MUnit 2.1编译自动生成的示例测试(使用标准haxelib run munit gen制作,然后使用haxelib run munit t使用或不使用-coverage运行)以进行HaxeFlixel游戏(闪存目标) .2在Windows 7上使用Haxe 3.2.1。我得到:

HaxeWrapper.hx:73: --macro:1: character 0 : Invalid package : subfolder should be <empty>

...其中subfolder是我的主source目录的子文件夹。游戏本身编译得很好,在subfolder.*(和subfolder.nestedsubfolder.*等)包中引用了所有地方,但source本身的一些类只有package;命名空间

给出的行号并不完全告诉我在项目中可能需要修复的内容......在我尝试挖掘(在我的头上)到HaxeWrapper.hx之前,这是一个已知的问题,有子文件夹/不同的包项目中的名称,还是什么?

BTW我还有另一个项目没有发生这种情况,但在该项目中,source只包含一个子文件夹,其中的所有内容都共享相同的包命名空间(即package subfolder;)。 (因此我的问题。)

更新

我之前有mcover也在处理我的项目,只是为了手动测试指标。从那以后它增长了很多,因此,我将事物组织到包子文件夹中。与此同时,我没有尝试启用mcover,因为它在调试过程中使步进更加繁琐。现在,当我重新启用mcover时,我的项目将无法编译,提供与上面相同的错误消息,但没有HaxeWrapper.hx:73:前缀。

1 个答案:

答案 0 :(得分:2)

我认为这意味着您将文件自动生成subfolder,但不包含package subfolder;。我之前从未听说过mcover,但似乎在某些代码导致Haxe在文件系统中查找Haxe类文件并且Haxe发现该文件没有package时会产生类似的错误消息语句匹配Haxe找到的路径。但是,它会产生与您预期不同的错误。

预期错误示例

subfolder/MyClass.hx

class MyClass {
  public static function main() {
    Sys.println("hi");
  }
}

输出:

>haxe -cpp x.cpp subfolder.MyClass
Invalid commandline class : subfolder.MyClass should be MyClass

这是我希望在尝试访问MyClass时看到的错误。但是,只有当Haxe最初尝试解析指定为入口点的类名时,才会显示此有用的错误消息。

同样的原因,不同的错误

假设您仍然如上所述subfolder/MyClass.hx,请添加一个包含正确package语句的新类:

subfolder/AnotherClass.hx

package subfolder;

class AnotherClass {
  static function main() {
    MyClass.main();
  }
}

输出:

>haxe -cpp x.cpp subfolder.AnotherClass
subfolder/AnotherClass.hx:5: characters 4-11 : Invalid package : subfolder should be <empty>

如果我转到AnotherClass.hx:5:5characters 4-11似乎是0索引?),我会看到MyClass。所以它真正令人窒息的是它希望加载subfolder.MyClass,但在加载模块后,模块声称其完全限定名称为MyClass,因为它没有package语句。 / p>

对问题的申请

所以,据我所知,你的mcover东西正在生成缺少package语句的文件。如果它有-namespace-root-package这样的选项,或者您可以告诉它分析.目录而不是./subfolder,那么它可能会表现得更好。您是否将mcover工具传递给传递给haxe -cp的值以外的值?

另一个想法,基于mcover的作用,是它引用了项目中缺少package subfolder;的.hx文件。如果我将AnotherClass.hx更改为不调用MyClass.main(),我可以使用subfolder.AnotherClass作为入口点成功编译。似乎Haxe甚至不会尝试解析/读取MyClass.hx如果它正在分析的其他代码没有引用它。使用覆盖工具,该工具可能会尝试包装/自动生成引用它发现的所有文件的代码,甚至是Haxe本身通常甚至不编译的文件。当然,关键在于弄清楚哪些代码永远不会覆盖任何覆盖/从不运行; - )。

总而言之,如果您可以在错误消息引用的源代码位置找到类名,然后根据类名检查Haxe将加载的.hx文件,您可能会发现缺少package文件1}}陈述。虽然我不确定当错误没有源代码位置时你能做什么。