Skip to content

Conversation

@lewis6991
Copy link
Collaborator

@lewis6991 lewis6991 commented Feb 3, 2026

  • infer_call: infer and apply alias-call substitutions from call-site
    arguments, including colon/dot alignment, so returns like std.Unpack
    are concrete at the call site.
  • narrow/get_type_at_flow: drop explicit-annotation precedence and
    antecedent narrowing for assignments; just use the resolved expression
    type.
  • stats: prefer declared global type caches for name prefixes so member
    owners attach to their type defs (e.g., stdlib globals).
  • tests: add unpack alias-call coverage and a flow regression for
    doc-function assignment narrowing.

@gemini-code-assist
Copy link

Summary of Changes

Hello @lewis6991, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request refines the type flow analysis by introducing more precise narrowing for function assignments. It ensures that when a function-typed value is assigned to a variable that expects a function signature, the type system correctly narrows the variable's type to that signature, preventing incorrect diagnostic errors and improving type inference accuracy.

Highlights

  • Type Narrowing Improvement: Enhanced the type narrowing logic to correctly handle cases where a function-typed source is assigned to a target that expects a signature, ensuring compatibility and more accurate type inference.
  • New Test Case: Added test_doc_function_assignment_narrowing to validate the improved type narrowing behavior for function assignments, specifically when a variable can be either an integer or a function.

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Changelog
  • crates/emmylua_code_analysis/src/compilation/test/flow.rs
    • Added a new test case test_doc_function_assignment_narrowing to verify the correct type narrowing behavior when a function is assigned to a variable with a union type including a function signature.
  • crates/emmylua_code_analysis/src/semantic/infer/narrow/narrow_type/mod.rs
    • Modified the narrow_down_type function to include a new branch for LuaType::Signature. This branch now returns the target type if the source type is identified as a function, facilitating proper type narrowing for function assignments.
Activity
  • No specific review comments or activities have been recorded for this pull request yet.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

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

Code Review

This pull request correctly fixes an issue where function assignments did not properly narrow union types, and the added test case effectively validates this. I've suggested a small improvement to also handle narrowing from any and unknown types for consistency with how other types like table are handled.

}
}
LuaType::Signature(_) => {
if real_source_ref.is_function() {

Choose a reason for hiding this comment

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

medium

This is a good addition for narrowing function types. However, it doesn't handle cases where the source type is any or unknown. When a variable of type any is assigned a function, its type should be narrowed to that function's type. This is how LuaType::Table is handled, and for consistency, function types should behave similarly.

I suggest also checking for is_any() and is_unknown() on real_source_ref.

Suggested change
if real_source_ref.is_function() {
if real_source_ref.is_function() || real_source_ref.is_any() || real_source_ref.is_unknown() {

@lewis6991 lewis6991 changed the title fix(flow): narrow to assigned function signatures fix(analysis): resolve alias-call returns and simplify flow assignments Feb 3, 2026
@lewis6991 lewis6991 force-pushed the fix/narrow1212 branch 2 times, most recently from a7f02c9 to 67730a1 Compare February 4, 2026 00:41
treat signature targets as compatible when source is function-typed
@lewis6991 lewis6991 force-pushed the fix/narrow1212 branch 3 times, most recently from 4969e39 to 51549fa Compare February 6, 2026 21:05
- infer_call: infer and apply alias-call substitutions from call-site
  arguments, including colon/dot alignment, so returns like std.Unpack
  are concrete at the call site.
- narrow/get_type_at_flow: drop explicit-annotation precedence and
  antecedent narrowing for assignments; just use the resolved expression
  type.
- stats: prefer declared global type caches for name prefixes so member
  owners attach to their type defs (e.g., stdlib globals).
- tests: add unpack alias-call coverage and a flow regression for
  doc-function assignment narrowing.
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.

1 participant