Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BUGFIX beta] Local variables should win over helpers #17135

Merged
merged 1 commit into from
Oct 19, 2018

Conversation

chancancode
Copy link
Member

@chancancode chancancode commented Oct 19, 2018

{{#let this.foo as |foo|}}
  {{foo 1 2 3}}
    ~~~ local variable invocation!
{{/let}}

Previously, this would have tried to resolve and invoke the helper foo, ignoring the presence of the foo local variable. This is inconsistent with our general lexical lookup rules. This will now invoke foo local variable as a contextual component.

In other words, this removes the remaining "dot rule" exceptions for contextual components, as per RFC #311:

We propose to relax that rule to match the proposed angle bracket invocation semantics (i.e. allowing local variables without a dot, as well as @names, but disallowing implicit this lookup).

This commit also fixed another related issue:

{{#let (hash foo="foo-bar") as |h|}}
  {{h.foo 1 2 3}}
    ~~~~~ this is a string, not a component!
{{/let}}

Previously, this would have tried to resolve and invoke the foo-bar component. This is an unintended consequence (i.e. a bug) of the "dot rule" implementation. This will now raise a TypeError in development mode and result in undefined behavior in production builds (probably some other runtime error deep inside the Glimmer VM internals).

Fixes #17121, #16510.

@chancancode chancancode changed the title Local variables should win over helpers [BUGFIX beta] Local variables should win over helpers Oct 19, 2018
ComponentClass: Component.extend().reopenClass({
positionalParams: 'params',
}),
template: 'inner:{{#each params as |param|}} {{param}}{{/each}}'
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missing a trailing comma (fails the linting config)

```hbs
{{#let this.foo as |foo|}}
  {{foo 1 2 3}}
    ~~~ local variable invocation!
{{/let}}
```

Previously, this would have tried to resolve and invoke the helper `foo`,
ignoring the presence of the `foo` local variable. This is inconsistent
with our general lexical lookup rules. This will now invoke `foo` local
variable as a contextual component.

In other words, this removes the remaining "dot rule" exceptions for
contextual components, as per [RFC #311](https://github.com/emberjs/rfcs/blob/master/text/0311-angle-bracket-invocation.md):

> We propose to relax that rule to match the proposed angle bracket
> invocation semantics (i.e. allowing local variables without a dot, as
> well as `@names`, but disallowing implicit `this` lookup).

This commit also fixed another related issue:

```hbs
{{#let (hash foo="foo-bar") as |h|}}
  {{h.foo 1 2 3}}
    ~~~~~ this is a string, not a component!
{{/let}}
```

Previously, this would have tried to resolve and invoke the `foo-bar`
component. This is an unintended consequence (i.e. a bug) of the "dot
rule" implementation. This will now raise a `TypeError` in development
mode and result in undefined behavior in production builds (probably
some other runtime error deep inside the Glimmer VM internals).

Fixes #17121, #16510.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

local variables should always win over helper
2 participants