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

Refine type for opaque (remain user_type) #276

Merged
merged 1 commit into from
Feb 10, 2020

Conversation

FrankBro
Copy link
Collaborator

Allow opaque types to further refinement.

@FrankBro
Copy link
Collaborator Author

Not sure if I can create a failing test case. I expect it to fail if the Anno, Name or Args are different.

Copy link
Owner

@josefs josefs left a comment

Choose a reason for hiding this comment

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

@codecov-io
Copy link

Codecov Report

Merging #276 into master will increase coverage by <.01%.
The diff coverage is 100%.

Impacted file tree graph

@@            Coverage Diff             @@
##           master     #276      +/-   ##
==========================================
+ Coverage   87.64%   87.64%   +<.01%     
==========================================
  Files          18       18              
  Lines        2630     2631       +1     
==========================================
+ Hits         2305     2306       +1     
  Misses        325      325
Impacted Files Coverage Δ
src/typechecker.erl 90.97% <100%> (ø) ⬆️

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update cb75222...81a3d93. Read the comment docs.

@FrankBro FrankBro merged commit b1653fa into josefs:master Feb 10, 2020
@josefs
Copy link
Owner

josefs commented Feb 10, 2020

Not sure if I can create a failing test case. I expect it to fail if the Anno, Name or Args are different.

You could create a failing test case by trying to use user_types:my_opaque() as an integer(). I think that'd be a good addition to this PR.

-opaque my_opaque() :: integer().

-spec internal(my_opaque(), integer() | undefined) -> integer().
internal(_, undefined) -> 0;
Copy link
Collaborator

Choose a reason for hiding this comment

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

I'd expect a test that the type is still visible from inside the module, i.e. that the first parameter is used in this function.

@FrankBro
Copy link
Collaborator Author

Sorry I guess I was in a rush a bit 😅 . Will try to include these test cases tomorrow.

Comment on lines +3271 to +3274
refine_ty({user_type, Anno, Name, Args}, {user_type, Anno, Name, Args}, _TEnv) ->
% After being normalized, it's because it's defined as opaque.
% If it has the same annotation, name and args, it's the same.
type(none);
Copy link
Collaborator

Choose a reason for hiding this comment

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

There is a clause like this above:

refine_ty(?type(T, A), ?type(T, A), _) ->
    type(none);

Perhaps both these could be replaced by simply one clause like this:

refine_ty(Same, Same, _TEnv) ->
    %% If it's the same, it's the same
    type(none);

What do you think? Future improvement?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

The only thing is this would also catch a few other cases I haven't put thoughts into. From looking at gradualizer_type.erl, The other stuff that would pass:

  • ann_type: Are these supposed to be removed at that point? I think I saw a PR go by mentioning this but haven't looked into it enough.
  • var: Honestly have no clue, I have barely touched type variables at this point.
  • remote_type: Pretty sure normalize catches this and either expand it in a type, or a user_type if it's opaque.
  • user_type: D'uh. After normalization, the only way it's still a user_type is an opaque type from another module. Seems fine and would remove the case I wrote.

I created my other PR #277 but not sure I wanna include them. I merged this because I'm using our existant codebase to test my record refinement branch and I needed this change 😄

Copy link
Collaborator

Choose a reason for hiding this comment

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

OK!

Anything minus itself would be none() I guess, even a type variable. (Then, perhaps we also may want to add other cases such as SomeType \ TypeVar and vice versa and add constraints.)

@zuiderkwast
Copy link
Collaborator

Very good! I think it's good that you merged, because it was already complete and working. More tests, refactoring, etc. can always be done later.

berbiche pushed a commit to berbiche/Gradualizer that referenced this pull request Feb 9, 2021
Allow type refinement in the presence of matching opaque types.
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.

5 participants