【问题标题】:Dart2js brackets Symbol in metadata annotationDart2js 括号中的元数据注释中的符号
【发布时间】:2014-07-29 05:47:06
【问题描述】:

我可以在 Dart VM 上运行这段代码:

@MirrorsUsed(metaTargets: Tag)
import 'dart:mirrors';

class Tag {
  final Symbol name;
  const Tag(this.name);
}
@proxy
@Tag(#[])
class Tagged {
  noSuchMethod(Invocation invocation) {
    InstanceMirror instanceMirror = reflect(this);
    ClassMirror classMirror = instanceMirror.type;
    classMirror.metadata.forEach((em) {
      if (em.reflectee is Tag && em.reflectee.name == invocation.memberName)
         print(invocation.positionalArguments);
    });
  }
}
void main() {
  var tagged = new Tagged();
  tagged[42];
  tagged.foo();
  tagged["Dart"];
}

输出:

[42]
[飞镖]

但是当我尝试用 dart2js 编译它时,它会因为这个错误而失败:

[来自 Dart2JS 的错误]:
bin\dart2jswithbracketanotation.dart:9:7:
预期的标识符,但得到了 '['。
@标签(#[])

那么哪个有bug?:

  1. (Dart VM)因为我可以运行它。
  2. (dart2js) 因为它不能编译成 js。

更新: I reported this bug

【问题讨论】:

  • #[] 应该做什么/生产?
  • 根据规范,它应该为[] 运算符创建一个符号。如果您改用 const Symbol('[]'); 会出现什么错误(应该具有相同的语义)
  • @GünterZöchbauer 我添加了更多样板 - 为了现实主义:)
  • 您是否已经尝试过const Symbol('[]'); 或其他一些运算符,例如#+
  • @GünterZöchbauer 是的。 #+ 可以,#[] 不行

标签: dart dart2js


【解决方案1】:

我认为这是 Dart2JS 中的一个错误,因为应该允许在此位置使用运算符。

【讨论】:

  • 您能填写一份错误报告吗?我只想知道我可以依赖哪种行为。
  • 为什么不自己创建错误报告?
  • 你能给我提供一个链接吗?它说它应该为 [] 运算符创建一个符号?我仍然不确定哪个(VM 或 dart2js)有错误。
  • dartlang.org/docs/spec/latest/… section 'Symbols' symbolLiteral: '#'(operator | (identifier ('.' identifier)*))
  • 谢谢!我想你是正确的。此外,它适用于其他运营商。我会报告这个问题。
猜你喜欢
  • 2017-01-16
  • 1970-01-01
  • 2014-09-15
  • 2017-09-14
  • 2016-10-03
  • 1970-01-01
  • 2020-08-15
  • 2012-09-29
  • 1970-01-01
相关资源
最近更新 更多