bug(transpiler): Support optional arguments in annotations.
Clean-up: move annotaitons out of fixtures/annotations, since we have the @CONST annotation in the transpiler already.
This commit is contained in:
parent
90fd1a9227
commit
4f416694a5
|
@ -1,9 +1,25 @@
|
||||||
import {describe, it, expect} from 'test_lib/test_lib';
|
import {describe, it, expect} from 'test_lib/test_lib';
|
||||||
import {Provide, readFirstAnnotation} from './fixtures/annotations';
|
import {readFirstAnnotation} from './fixtures/annotations';
|
||||||
|
import {CONST} from 'facade/lang';
|
||||||
|
|
||||||
class Inject {}
|
class Inject {}
|
||||||
class Bar {}
|
class Bar {}
|
||||||
|
|
||||||
|
class Provide {
|
||||||
|
@CONST()
|
||||||
|
constructor(token) {
|
||||||
|
this.token = token;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class AnnotateMe {
|
||||||
|
@CONST()
|
||||||
|
constructor({maybe = 'default'} = {}) {
|
||||||
|
this.maybe = maybe;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@Provide('Foo')
|
@Provide('Foo')
|
||||||
class Foo {
|
class Foo {
|
||||||
@Inject
|
@Inject
|
||||||
|
@ -13,6 +29,12 @@ class Foo {
|
||||||
@Provide(Foo)
|
@Provide(Foo)
|
||||||
function baz() {}
|
function baz() {}
|
||||||
|
|
||||||
|
@AnnotateMe()
|
||||||
|
class A {}
|
||||||
|
|
||||||
|
@AnnotateMe({maybe: 'yes'})
|
||||||
|
class B {}
|
||||||
|
|
||||||
function annotatedParams(@Inject(Foo) f, @Inject(Bar) b) {}
|
function annotatedParams(@Inject(Foo) f, @Inject(Bar) b) {}
|
||||||
|
|
||||||
export function main() {
|
export function main() {
|
||||||
|
@ -22,5 +44,10 @@ export function main() {
|
||||||
var clazz = readFirstAnnotation(Foo);
|
var clazz = readFirstAnnotation(Foo);
|
||||||
expect(clazz instanceof Provide).toBe(true);
|
expect(clazz instanceof Provide).toBe(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should work with named arguments', function() {
|
||||||
|
expect(readFirstAnnotation(A).maybe).toBe('default');
|
||||||
|
expect(readFirstAnnotation(B).maybe).toBe('yes');
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,20 +1,5 @@
|
||||||
import 'dart:mirrors';
|
import 'dart:mirrors';
|
||||||
|
|
||||||
// This class is not generated,
|
|
||||||
// but should be in the future.
|
|
||||||
//
|
|
||||||
// Problems:
|
|
||||||
// - Dart requires annotations to be const (which makes sense).
|
|
||||||
// Right now, I can't describe that in ES6.
|
|
||||||
class Provide {
|
|
||||||
final token;
|
|
||||||
const Provide(this.token);
|
|
||||||
}
|
|
||||||
|
|
||||||
class CONST {
|
|
||||||
const CONST();
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: this api does not yet return an array as we don't have
|
// TODO: this api does not yet return an array as we don't have
|
||||||
// a nice array wrapper for Dart
|
// a nice array wrapper for Dart
|
||||||
readFirstAnnotation(clazz) {
|
readFirstAnnotation(clazz) {
|
||||||
|
|
|
@ -1,18 +1,3 @@
|
||||||
// This class is not generated,
|
|
||||||
// but should be in the future.
|
|
||||||
//
|
|
||||||
// Problems:
|
|
||||||
// - Dart requires annotations to be const (which makes sense).
|
|
||||||
// Right now, I can't describe that in ES6.
|
|
||||||
export class Provide {
|
|
||||||
constructor(token) {
|
|
||||||
this.token = token;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export class CONST {
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: this api does not yet return an array as we don't have
|
// TODO: this api does not yet return an array as we don't have
|
||||||
// a nice array wrapper for Dart
|
// a nice array wrapper for Dart
|
||||||
export function readFirstAnnotation(clazz) {
|
export function readFirstAnnotation(clazz) {
|
||||||
|
|
|
@ -48,6 +48,12 @@ export class NamedParamsTransformer extends ParseTreeTransformer {
|
||||||
return tree;
|
return tree;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
transformAnnotation(tree) {
|
||||||
|
tree = super.transformAnnotation(tree);
|
||||||
|
if (tree.args) this._handleNamedParams(tree);
|
||||||
|
return tree;
|
||||||
|
}
|
||||||
|
|
||||||
_handleNamedParams(tree) {
|
_handleNamedParams(tree) {
|
||||||
if (this._isLastArgAnNonEmptyObjectLiteral(tree) &&
|
if (this._isLastArgAnNonEmptyObjectLiteral(tree) &&
|
||||||
! this._isLastArgObjectLiteralWithQuotedKeys(tree)) {
|
! this._isLastArgObjectLiteralWithQuotedKeys(tree)) {
|
||||||
|
|
Loading…
Reference in New Issue