MVCoconut / coconut.ui

Wow, such reactive view! Much awesome!
The Unlicense
89 stars 9 forks source link

Missing type hint of @:state results in macro encoding error #70

Closed kevinresol closed 4 years ago

kevinresol commented 4 years ago
class Main extends coconut.react.View {
    static function main() coconut.react.Renderer.mount(js.Browser.document.getElementById('app'), '<Main/>');
    @:state var value = 'initial';
    function render() '<div>$value</div>';
    override function viewDidMount() value = 'updated';
}

Note the missing type hint for value

Error ``` [{ access: [APublic] doc: null kind: FFun({ args: [{ meta: null name: __coco_data_ opt: false type: TAnonymous([]) value: null }] expr: { expr: EBlock([{ expr: EBlock([]) pos: #pos }, { expr: ECall({ expr: EField({ expr: EConst(CIdent(this)) pos: #pos }, __initAttributes) pos: #pos }, [{ expr: EConst(CIdent(__coco_data_)) pos: #pos }]) pos: #pos }, { expr: EVars([{ expr: { expr: EConst(CIdent(null)) pos: #pos } isFinal: false name: snapshot type: null }]) pos: #pos }, { expr: ECall({ expr: EConst(CIdent(super)) pos: #pos }, [{ expr: EConst(CIdent(render)) pos: #pos }, { expr: EConst(CIdent(null)) pos: #pos }, { expr: EConst(CIdent(null)) pos: #pos }, { expr: EConst(CIdent(null)) pos: #pos }, { expr: EFunction(FAnonymous, { args: [{ meta: null name: firstTime opt: false type: TPath({ name: Bool pack: [] params: [] sub: null }) value: null }] expr: { expr: EBlock([{ expr: EIf({ expr: EConst(CIdent(firstTime)) pos: #pos }, { expr: ECall({ expr: EConst(CIdent(viewDidMount)) pos: #pos }, []) pos: #pos }, null) pos: #pos }]) pos: #pos } params: [] ret: null }) pos: #pos }]) pos: #pos }, { expr: ESwitch({ expr: EParenthesis({ expr: EConst(CIdent(null)) pos: #pos }) pos: #pos }, [{ expr: null guard: null values: [{ expr: EConst(CIdent(null)) pos: #pos }] }, { expr: { expr: EBlock([{ expr: ECall({ expr: EConst(CIdent(beforeUnmounting)) pos: #pos }, [{ expr: EConst(CIdent(v)) pos: #pos }]) pos: #pos }]) pos: #pos } guard: null values: [{ expr: EConst(CIdent(v)) pos: #pos }] }], null) pos: #pos }]) pos: #pos } params: [] ret: TPath({ name: Void pack: [] params: [] sub: null }) }) meta: [{ name: :keep params: [] pos: #pos }] name: new pos: #pos }, { access: [AStatic] doc: null kind: FFun({ args: [] expr: { expr: ECall({ expr: EField({ expr: EField({ expr: EField({ expr: EConst(CIdent(coconut)) pos: #pos }, react) pos: #pos }, Renderer) pos: #pos }, mount) pos: #pos }, [{ expr: ECall({ expr: EField({ expr: EField({ expr: EField({ expr: EConst(CIdent(js)) pos: #pos }, Browser) pos: #pos }, document) pos: #pos }, getElementById) pos: #pos }, [{ expr: EConst(CString(app, SingleQuotes)) pos: #pos }]) pos: #pos }, { expr: EConst(CString(
, SingleQuotes)) pos: #pos }]) pos: #pos } params: [] ret: null }) meta: [] name: main pos: #pos }, { access: [] doc: null kind: FProp(get, set, null, null) meta: [{ name: :state params: [] pos: #pos }] name: value pos: #pos }, { access: [] doc: null kind: FFun({ args: [] expr: { expr: EBlock([{ expr: EReturn({ expr: ECall({ expr: EConst(CIdent(hxx)) pos: #pos }, [{ expr: EConst(CString(
$value
, SingleQuotes)) pos: #pos }]) pos: #pos }) pos: #pos }]) pos: #pos } params: [] ret: TPath({ name: RenderResult pack: [coconut, react] params: [] sub: null }) }) meta: [{ name: :noCompletion params: [] pos: #pos }, { name: :native params: [{ expr: EConst(CString(coconutRender, SingleQuotes)) pos: #pos }] pos: #pos }] name: render pos: #pos }, { access: [] doc: null kind: FFun({ args: [] expr: { expr: EBinop(OpAssign, { expr: EConst(CIdent(value)) pos: #pos }, { expr: EConst(CString(updated, SingleQuotes)) pos: #pos }) pos: #pos } params: [] ret: TPath({ name: Void pack: [] params: [] sub: null }) }) meta: [{ name: :noCompletion params: [] pos: #pos }] name: viewDidMount pos: #pos }, { access: [APrivate] doc: null kind: FVar(TPath({ name: State pack: [tink, state] params: [TPType(null <- expected enum value)] sub: null }), { expr: ENew({ name: State pack: [tink, state] params: [TPType(null <- expected enum value)] sub: null }, [{ expr: EConst(CString(initial, SingleQuotes)) pos: #pos }, { expr: EConst(CIdent(null)) pos: #pos }]) pos: #pos }) meta: [{ name: :noCompletion params: [] pos: #pos }] name: __coco_value pos: #pos }, { access: [AInline] doc: null kind: FFun({ args: [] expr: { expr: EReturn({ expr: EField({ expr: EConst(CIdent(__coco_value)) pos: #pos }, value) pos: #pos }) pos: #pos } params: [] ret: null }) meta: [] name: get_value pos: #pos }, { access: [AInline] doc: null kind: FFun({ args: [{ meta: null name: param opt: false type: null value: null }] expr: { expr: EBlock([{ expr: ECall({ expr: EField({ expr: EConst(CIdent(__coco_value)) pos: #pos }, set) pos: #pos }, [{ expr: EConst(CIdent(param)) pos: #pos }]) pos: #pos }, { expr: EReturn({ expr: EConst(CIdent(param)) pos: #pos }) pos: #pos }]) pos: #pos } params: [] ret: null }) meta: [] name: set_value pos: #pos }, { access: null doc: null kind: FFun({ args: [{ meta: null name: attributes opt: false type: TAnonymous([]) value: null }] expr: { expr: EBlock([]) pos: #pos } params: [] ret: null }) meta: [{ name: :noCompletion params: [] pos: #pos }] name: __initAttributes pos: #pos }, { access: [AStatic, APublic] doc: null kind: FFun({ args: [{ meta: null name: attributes opt: false type: TAnonymous([{ access: null doc: null kind: FProp(default, never, TPath({ name: Key pack: [coconut, react] params: [] sub: null }), null) meta: [{ name: :optional params: [] pos: #pos }] name: key pos: #pos }, { access: null doc: null kind: FProp(default, never, TPath({ name: Ref pack: [coconut, ui] params: [TPType(TPath({ name: Main pack: [] params: [] sub: null }))] sub: null }), null) meta: [{ name: :optional params: [] pos: #pos }] name: ref pos: #pos }]) value: null }] expr: { expr: EBlock([{ expr: EReturn({ expr: ECast({ expr: ECall({ expr: EField({ expr: EField({ expr: EConst(CIdent(react)) pos: #pos }, React) pos: #pos }, createElement) pos: #pos }, [{ expr: ECast({ expr: EConst(CIdent(Main)) pos: #pos }, null) pos: #pos }, { expr: EConst(CIdent(attributes)) pos: #pos }]) pos: #pos }, null) pos: #pos }) pos: #pos }]) pos: #pos } params: [] ret: TPath({ name: RenderResult pack: [coconut, ui] params: [] sub: null }) }) meta: null name: fromHxx pos: #pos }] line 282: expected enum value line 288: expected enum value ```