Skip to content

Shapes::keyExists does not refine nested key information #9294

Open

Description

@muglug

Describe the bug
Originally reported by @eryi here: #8012 (comment)

Standalone code, or other way to reproduce the problem

function myfunc(shape(?'a' => shape(?'b' => string)) $var): void {
  if (!Shapes::keyExists($var, 'a')) throw new Exception();
  if (!Shapes::keyExists($var['a'], 'b')) throw new Exception();

  // Invalid index operation: 'optional' is marked as an optional shape field....
  echo $var['a']['b'];
}

Expected behavior

There should be no error

Actual behavior

File "/foo.hack", line 6, characters 18-20:
The field `b` may not be present in this shape. Use `Shapes::idx()` instead. (Typing[4165])
  File "/foo.hack", line 1, characters 38-40:
  This is where the field was declared as optional.

Environment

HipHop VM 4.172.0 (rel) (non-lowptr)
Compiler: 1667340154_989010953
Repo schema: 63eaf8b56fb7edbc7a8ca9e32786eb0c1f8f508c

Activity

  1. 1samekhan commented on Mar 7, 2024

    @1samekhan

    function myfunc(shape(?'a' => shape(?'b' => string)) $var): void {
    if (!Shapes::keyExists($var, 'a')) throw new Exception();
    if (!Shapes::keyExists($var['a'], 'b')) throw new Exception();

    // Invalid index operation: 'optional' is marked as an optional shape field....
    echo $var['a']['b'];
    }

  2. 1samekhan commented on Mar 7, 2024

    @1samekhan

    File "/foo.hack", line 6, characters 18-20:
    The field b may not be present in this shape. Use Shapes::idx() instead. (Typing[4165])
    File "/foo.hack", line 1, characters 38-40:
    This is where the field was declared as optional.

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

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions