GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — No state hints when an overload with the same arity hides an inherited refinement · Issue #463 · liquid-java/liquidjava

No state hints when an overload with the same arity hides an inherited refinement #463

New issue
Copy link
New issue
Copy link
Open
Open
No state hints when an overload with the same arity hides an inherited refinement#463
Copy link
Labels
bugSomething isn't workingSomething isn't working

Description

@CatarinaGamboa
CatarinaGamboa
opened on Nov 2, 2026
Issue body actions

Impact: a refinement in a superclass's spec is not used for hints on a subclass receiver when some class in between declares an overload with the same name and number of parameters. The error has no hints at all, although the fix is a single call the spec describes.

Minimal reproducer

// Refs.java
@StateSet({"noPopup", "hasPopup"})
@ExternalRefinementsFor("java.awt.Component")
public interface Refs {
    @StateRefinement(to = "hasPopup(this)")
    void add(java.awt.PopupMenu popup);
}

@ExternalRefinementsFor("java.awt.Frame")
interface FrameRefs {
    @StateRefinement(to = "noPopup(this)")
    void Frame(String title);

    @StateRefinement(from = "hasPopup(this)")
    void setState(int state);
}

// Use.java
public class Use {
    static void hint() {
        Frame f = new Frame("x");
        f.setState(0);           // error, no hints
    }

    static void followHint() {
        Frame f = new Frame("x");
        f.add(new PopupMenu());
        f.setState(0);           // verifies
    }
}

Actual (main @ 19991d3, and with the PR for #456): found noPopup(f) but expected hasPopup(f) with no hints. Main has no hints because the machine is only built from Frame's own spec. With #456, the state machine for a Frame receiver includes inherited refinements, but only when the nearest type that declares a method with that name and number of parameters is the type the refinement is written for. Container declares add(Component), which also has one parameter, so Component.add(PopupMenu) is left out (the machine is marked incomplete, so the hints stay sound).

Expected:

Hints:
  - Call f.add(PopupMenu) before this call to move f from noPopup to hasPopup

To get there, StateMachineBuilder should match a declaring method by its erased parameter types, and fall back to the number of parameters only when the types cannot be compared (e.g. type variables).

Depends on the PR for #456.

Activity

  1. CatarinaGamboa
    added
    bugSomething isn't workingSomething isn't working
    on Nov 2, 2026
  2. CatarinaGamboa
    added a commit that references this issue on Nov 3, 2026

    Give state hints when the state set or methods come from the receiver…

    dc1a63f
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      You are visitor 01402503 — GeezerVison does not store the pages you look up.
      Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.