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

Fixes Self not found in match statement. #4459

Merged
merged 3 commits into from
Apr 24, 2023
Merged

Conversation

esdrubal
Copy link
Contributor

@esdrubal esdrubal commented Apr 18, 2023

Description

Self was not working when qualifying an enum variant in a match statement.

The solution was to add the implementing type declaration as an impl_trait namespace symbol named "Self".

Closes #4263.

Checklist

  • I have linked to any relevant issues.
  • I have commented my code, particularly in hard-to-understand areas.
  • I have updated the documentation where relevant (API docs, the reference, and the Sway book).
  • I have added tests that prove my fix is effective or that my feature works.
  • I have added (or requested a maintainer to add) the necessary Breaking* or New Feature labels where relevant.
  • I have done my best to ensure that my PR adheres to the Fuel Labs Code Review Standards.
  • I have requested a review from the relevant team or maintainers.

`Self` was not working when qualifying an enum variant in a match statement.

The solution was to add the implementing type declaration as an impl_trait
namespace symbol.

Closes #4263.
@esdrubal esdrubal self-assigned this Apr 18, 2023
@esdrubal esdrubal added bug Something isn't working P: critical Should be looked at before anything else compiler: frontend Everything to do with type checking, control flow analysis, and everything between parsing and IRgen labels Apr 18, 2023
@mohammadfawaz mohammadfawaz requested review from a team and emilyaherbert April 18, 2023 16:43
@anton-trunov
Copy link
Contributor

I might be wrong but I'm thinking maybe reusing the replace_self_type function is the way to go here?

@esdrubal
Copy link
Contributor Author

esdrubal commented Apr 20, 2023

I might be wrong but I'm thinking maybe reusing the replace_self_type function is the way to go here?

It looks like we are trying to resolve the enum scrutinee from its call path during its type_check which occurs before replace_self_type is called.

// find the enum definition from the name
let unknown_decl = check!(
ctx.namespace.resolve_call_path(&enum_callpath).cloned(),
return err(warnings, errors),
warnings,
errors
);

The error Could not find symbol "Self" in this scope. occurs in the code above.

@IGI-111 IGI-111 requested a review from a team April 24, 2023 07:45
@esdrubal esdrubal merged commit 666db0f into master Apr 24, 2023
@esdrubal esdrubal deleted the esdrubal/4263_self_match branch April 24, 2023 09:54
anton-trunov added a commit that referenced this pull request Oct 3, 2023
## Description

Fixes #4877

## Tasks

- [x] Make a simple example with a trait and an impl for it compile
- [x] Fix typechecking for empty enums
- [x] Fix typechecking for trait impl methods
- [x] Fix typechecking for impl self blocks
- [x] Fix the case of non-implemented supertraits
- [x] Fix typechecking of generic traits
- [x] Fix typechecking of generic impl self blocks
- [x] Resolve ambiguity between term/path-level `Self` and the
type-level `Self` type parameter (related PR #4459):
       - [x] enums
       - [x] structs (deferred as issue #5164)
- [x] Fix `Self` for type constraints
- [x] Fix looping during insertion of trait constraints for generic
tuples (inserted `occurs_check` to prevent unification of a generic `A`
with a tuple `(A, A)`;
- [x] Fix exponential growth of the traits map (around 30 tests out of
more than 680 are failing now); related PR: #5004
- [x] Fix `Self` type for blanket implementations
- [x] Fix `Self` for associated consts
- [x] Fix name resolution issues for some tests with traits (like
`should_pass/language/eq_intrinsic`); blocking issues:
       - #5018 
       - #5036
- [x] Fix `should_fail/generic_traits` test
- [x] Fix `should_pass/language/where_clause_impls` test
- [x] Fix `should_pass/language/name_resolution_inside_intrinsics` test
- [x] Remove some commented out code in `impl_trait.rs`
- [x] Comment new code
- [x] **Disable** `should_pass/language/associated_type_container` test
- [x] **Disable** `should_pass/language/associated_type_method` test
- [x] **Disable**
`should_pass/language/associated_type_and_associated_const` test
- [x] **Disable** `should_pass/language/associated_type_iterator` test

## Checklist

- [x] I have linked to any relevant issues.
- [x] I have commented my code, particularly in hard-to-understand
areas.
- [x] I have updated the documentation where relevant (API docs, the
reference, and the Sway book).
- [x] I have added tests that prove my fix is effective or that my
feature works.
- [x] I have added (or requested a maintainer to add) the necessary
`Breaking*` or `New Feature` labels where relevant.
- [x] I have done my best to ensure that my PR adheres to [the Fuel Labs
Code Review
Standards](https://github.com/FuelLabs/rfcs/blob/master/text/code-standards/external-contributors.md).
- [x] I have requested a review from the relevant team or maintainers.

---------

Co-authored-by: Joshua Batty <[email protected]>
Co-authored-by: IGI-111 <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working compiler: frontend Everything to do with type checking, control flow analysis, and everything between parsing and IRgen P: critical Should be looked at before anything else
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Self does not work when qualifying an enum variant in a match statement
4 participants