atscript-playground icon indicating copy to clipboard operation
atscript-playground copied to clipboard

No support for field annotations

Open RReverser opened this issue 10 years ago • 7 comments

Tried very simple example:

class Point {
  x:int;
  y:int;
}

And it doesn't seem to work. Throws:

Error:
main.ats:2:4: Unexpected token :
main.ats:2:8: Unexpected token ;
main.ats:3:3: Unexpected token y
main.ats:3:4: Unexpected token :
main.ats:3:5: Semi-colon expected
main.ats:4:2: Unexpected token End of File

RReverser avatar Nov 06 '14 18:11 RReverser

Seeing the same. In fact, anything with int is failing for me. Using number though with parameter annotations works, but not for field annotations. For example, this works fine:

class MyClass {
    constructor(xArg:number, yArg:number) {
        this.x = xArg;
        this.y = yArg;
    }
}
var myClass = new MyClass(1, 2);
console.log(myClass);

var myClass2 = new MyClass("test", "test");  // this will fail in the console (as expected)

But this doesn't:

class MyClass {
    x:number;
    y:number;
}

smaye81 avatar Nov 06 '14 19:11 smaye81

I solved the problem on my side by adding this to the config.json : "memberVariables":true I guessed it by looking at this line of the traceur code: https://github.com/google/traceur-compiler/blob/master/src/Options.js#L143

mlb6 avatar Nov 18 '14 01:11 mlb6

Interesting. I can get it to compile by doing that also. I can also define a class like above with:

export class Point {
    x:int;
}

But if I try to instantiate it like so:

var point = new Point(5);
console.log(point);

I see this in my console:

Point {x: (...)}
x: [Exception: ReferenceError: int is not defined]
__proto__: Point

And this is my config:

{
  "traceur": {
    "modules": "register",
    "moduleName" : true,
    "script": false,
    "types": true,
    "typeAssertions": true,
    "typeAssertionModule": "assert",
    "annotations": true,
    "sourceMaps": false,
    "memberVariables" : true,
    "experimental" : true
  }
}

smaye81 avatar Nov 18 '14 03:11 smaye81

You get this error because you forgot to write a constructor :

export class Point {
  x:int;
  constructor(x:int){
    this.x = x;
  }
}

mlb6 avatar Nov 20 '14 21:11 mlb6

Shouldn't the transpiler auto-generate the constructor for me? Take a look at the AtScript primer by @mhevery

https://docs.google.com/document/d/11YUzC-1d0V1-Q3V0fQ7KSit97HnZoKVygDxpWzEYW0U/mobilebasic?viewopt=127

Look at the Field Annotations section, specifically this line:

By specifying the fields in this way, the transpiler can generate the constructor which then pre-creates the fields.

smaye81 avatar Nov 20 '14 21:11 smaye81

It specifies that the transpiler can generate the constructor. But it does not say if the constructor will assign values. In the example provided by @mhevery field variables are assigned to null.

class MyClass {
  constructor() {
    this.x = null; // auto-generated
    this.y = null; // auto-generated
  }
}

But when I transpile the code into es6 using traceur, there is no constructor :

class Point {
  get x() {
    return this.$__0;
  }
  set x(value) {
    this.$__0 = value;
  }
  get y() {
    return this.$__1;
  }
  set y(value) {
    this.$__1 = value;
  }
}
Object.defineProperty(Object.getOwnPropertyDescriptor(Point.prototype, "x").set, "parameters", {get: function() {
    return [[int]];
  }});
Object.defineProperty(Object.getOwnPropertyDescriptor(Point.prototype, "y").set, "parameters", {get: function() {
    return [[int]];
  }});

So, I agree with you on the fact it does not generate constructor, but anyway according to this document atScript will not auto-assign your fields. So, you'll have to write a constructor.

mlb6 avatar Nov 20 '14 21:11 mlb6

work in progress.

On Thu Nov 20 2014 at 1:39:03 PM Martin Le Bas [email protected] wrote:

It specifies that the transpiler can generate the constructor. But it does not say if the constructor will assign values. In the example provided by @mhevery https://github.com/mhevery field variables are assigned to null.

class MyClass { constructor() { this.x = null; // auto-generated this.y = null; // auto-generated } }

But when I transpile the code into es6 using traceur, there is no constructor :

class Point { get x() { return this.$__0; } set x(value) { this.$__0 = value; } get y() { return this.$__1; } set y(value) { this.$__1 = value; } }Object.defineProperty(Object.getOwnPropertyDescriptor(Point.prototype, "x").set, "parameters", {get: function() { return [[int]]; }});Object.defineProperty(Object.getOwnPropertyDescriptor(Point.prototype, "y").set, "parameters", {get: function() { return [[int]]; }});

So, I agree with you on the fact it does not generate constructor, but anyway according to this document atScript will not auto-assign your fields. So, you'll have to write a constructor.

— Reply to this email directly or view it on GitHub https://github.com/angular/atscript-playground/issues/7#issuecomment-63884653 .

mhevery avatar Nov 20 '14 23:11 mhevery