From d3157b4e2f5713c49b8a924c66161f246c5a67ba Mon Sep 17 00:00:00 2001 From: Jon Sully Date: Sat, 22 Jul 2023 14:04:16 +0100 Subject: [PATCH] Fix constants/gets not working within a Provider --- spec/compilers/provider_with_items | 102 ++++++++++++++++++++++++++++ spec/formatters/constant_provider | 24 +++++++ spec/formatters/provider_with_items | 34 ++++++++++ spec/type_checking/provider_const | 24 +++++++ src/formatters/provider.cr | 2 +- src/parsers/provider.cr | 2 +- src/type_checker/scope.cr | 2 +- 7 files changed, 187 insertions(+), 3 deletions(-) create mode 100644 spec/compilers/provider_with_items create mode 100644 spec/formatters/constant_provider create mode 100644 spec/formatters/provider_with_items create mode 100644 spec/type_checking/provider_const diff --git a/spec/compilers/provider_with_items b/spec/compilers/provider_with_items new file mode 100644 index 000000000..e1cfe9c0e --- /dev/null +++ b/spec/compilers/provider_with_items @@ -0,0 +1,102 @@ +record Subscription { + a : Bool, + b : Bool +} + +provider Provider : Subscription { + const NAME = "hello" + + state a : String = "" + + get b : String { + a + } + + fun name : String { + NAME + } +} + +component Main { + use Provider { + a: true, + b: false + } + + fun render { +
+ } +} +-------------------------------------------------------------------------------- +const A = _R({ + a: [ + "a", + Decoder.boolean + ], + b: [ + "b", + Decoder.boolean + ] +}); + +const B = new(class extends _P { + constructor() { + super(); + + this.state = { + c: `` + }; + + this._d({ + b: () => { + return `hello` + } + }); + } + + get c() { + return this.state.c; + } + + get d() { + return this.c + } + + a() { + return this.b; + } +}); + +class C extends _C { + componentWillUnmount() { + B._unsubscribe(this); + } + + componentDidUpdate() { + if (true) { + B._subscribe(this, new A({ + a: true, + b: false + })) + } else { + B._unsubscribe(this) + }; + } + + componentDidMount() { + if (true) { + B._subscribe(this, new A({ + a: true, + b: false + })) + } else { + B._unsubscribe(this) + }; + } + + render() { + return _h("div", {}); + } +}; + +C.displayName = "Main"; diff --git a/spec/formatters/constant_provider b/spec/formatters/constant_provider new file mode 100644 index 000000000..4e2eb6646 --- /dev/null +++ b/spec/formatters/constant_provider @@ -0,0 +1,24 @@ +record Subscription { + a : Bool +} + +provider Provider:Subscription { + /* Comment */constNAME="hello" + + fun name:String { + NAME + } +} +-------------------------------------------------------------------------------- +record Subscription { + a : Bool +} + +provider Provider : Subscription { + /* Comment */ + const NAME = "hello" + + fun name : String { + NAME + } +} diff --git a/spec/formatters/provider_with_items b/spec/formatters/provider_with_items new file mode 100644 index 000000000..4efc415f6 --- /dev/null +++ b/spec/formatters/provider_with_items @@ -0,0 +1,34 @@ +record Subscription { + a : Bool +} + +provider Provider:Subscription { +/* Comment */constNAME="hello" + + state a :String = "" + getb:String { + a + } + fun name:String { + NAME + } +} +-------------------------------------------------------------------------------- +record Subscription { + a : Bool +} + +provider Provider : Subscription { + /* Comment */ + const NAME = "hello" + + state a : String = "" + + get b : String { + a + } + + fun name : String { + NAME + } +} diff --git a/spec/type_checking/provider_const b/spec/type_checking/provider_const new file mode 100644 index 000000000..8ea67f70b --- /dev/null +++ b/spec/type_checking/provider_const @@ -0,0 +1,24 @@ +record Subscription { + a : Bool +} + +provider Provider : Subscription { + const ONE_PLUS_ONE = 1 + 1 + const TWO = 2 + + fun test : Bool { + ONE_PLUS_ONE == TWO + } +} +-----------------------------------------------------------------VariableMissing +record Subscription { + a : Bool +} + +provider Provider : Subscription { + const TWO = 2 + + fun test : Bool { + 1 + TWO == THREE + } +} diff --git a/src/formatters/provider.cr b/src/formatters/provider.cr index 531f472ad..8d95fd3e1 100644 --- a/src/formatters/provider.cr +++ b/src/formatters/provider.cr @@ -8,7 +8,7 @@ module Mint node.subscription body = - list node.functions + node.comments + node.states + node.gets + list node.functions + node.comments + node.states + node.gets + node.constants comment = node.comment.try { |item| "#{format(item)}\n" } diff --git a/src/parsers/provider.cr b/src/parsers/provider.cr index 74709263e..b247bf75e 100644 --- a/src/parsers/provider.cr +++ b/src/parsers/provider.cr @@ -26,7 +26,7 @@ module Mint opening_bracket: ProviderExpectedOpeningBracket, closing_bracket: ProviderExpectedClosingBracket ) do - items = many { function || state || constant || self.comment } + items = many { function || state || get || constant || self.comment } raise ProviderExpectedBody if items.none?(Ast::Function) diff --git a/src/type_checker/scope.cr b/src/type_checker/scope.cr index 6b5340a74..3ca15c7af 100644 --- a/src/type_checker/scope.cr +++ b/src/type_checker/scope.cr @@ -156,7 +156,7 @@ module Mint node.functions.find(&.name.value.==(variable)) || node.states.find(&.name.value.==(variable)) || node.gets.find(&.name.value.==(variable)) || - node.constants.find(&.name.==(variable)) + node.constants.find(&.name.value.==(variable)) end end