final protected function getMarkerInterfacesByInterface()

in src/__Private/codegen/CodegenBase.hack [153:360]


  final protected function getMarkerInterfacesByInterface(
  ): dict<string, keyset<string>> {
    $ifs = dict[
      HHAST\IControlFlowStatement::class => keyset[
        HHAST\ILoopStatement::class,
        HHAST\ElseClause::class,
        HHAST\ElseifClause::class,
        HHAST\IfStatement::class,
        HHAST\SwitchStatement::class,
      ],
      HHAST\IClassBodyDeclaration::class => keyset[
        HHAST\MethodishDeclaration::class,
        HHAST\MethodishTraitResolution::class,
        HHAST\ContextConstDeclaration::class,
        HHAST\ConstDeclaration::class,
        HHAST\PropertyDeclaration::class,
        HHAST\RequireClause::class,
        HHAST\TraitUse::class,
        HHAST\TraitUseConflictResolution::class,
        HHAST\TypeConstDeclaration::class,
        HHAST\XHPCategoryDeclaration::class,
        HHAST\XHPClassAttributeDeclaration::class,
        HHAST\XHPChildrenDeclaration::class,
      ],
      HHAST\IComment::class => keyset[
        HHAST\SingleLineComment::class,
        HHAST\DelimitedComment::class,
      ],
      HHAST\IDeclaration::class => keyset[
        HHAST\ClassishDeclaration::class,
        // IFunctionishDeclaration
      ],
      HHAST\IFunctionishDeclaration::class => keyset[
        HHAST\FunctionDeclaration::class,
        HHAST\MethodishDeclaration::class,
      ],
      HHAST\IFunctionCallishExpression::class => keyset[
        HHAST\FunctionCallExpression::class,
        HHAST\ObjectCreationExpression::class,
      ],
      HHAST\IHasFunctionBody::class => keyset[
        HHAST\IFunctionishDeclaration::class,
        HHAST\AnonymousFunction::class,
        HHAST\AwaitableCreationExpression::class,
        HHAST\LambdaExpression::class,
      ],
      HHAST\IHasTypeHint::class => keyset[
        HHAST\IParameter::class,
        HHAST\PropertyDeclaration::class,
      ],
      HHAST\IHackArray::class => keyset[
        HHAST\DictionaryIntrinsicExpression::class,
        HHAST\KeysetIntrinsicExpression::class,
        HHAST\VectorIntrinsicExpression::class,
      ],
      HHAST\IContainer::class => keyset[
        HHAST\IHackArray::class,
        HHAST\DarrayIntrinsicExpression::class,
        HHAST\VarrayIntrinsicExpression::class,
        HHAST\CollectionLiteralExpression::class,
      ],
      HHAST\IHasOperator::class => keyset[
        HHAST\BinaryExpression::class,
        HHAST\PrefixUnaryExpression::class,
        HHAST\PostfixUnaryExpression::class,
      ],
      HHAST\ILambdaBody::class => keyset[
        HHAST\IExpression::class,
        HHAST\CompoundStatement::class,
      ],
      HHAST\ILambdaSignature::class => keyset[
        HHAST\VariableExpression::class,
        HHAST\LambdaSignature::class,
      ],
      HHAST\ILoopStatement::class => keyset[
        HHAST\DoStatement::class,
        HHAST\ForStatement::class,
        HHAST\ForeachStatement::class,
        HHAST\WhileStatement::class,
      ],
      HHAST\IHasAttributeSpec::class => keyset[
        HHAST\AliasDeclaration::class,
        HHAST\AwaitableCreationExpression::class,
        HHAST\AnonymousFunction::class,
        HHAST\ClassishDeclaration::class,
        HHAST\MethodishDeclaration::class,
        HHAST\EnumDeclaration::class,
        HHAST\FunctionDeclaration::class,
        HHAST\ParameterDeclaration::class,
        HHAST\PropertyDeclaration::class,
        HHAST\LambdaExpression::class,
        // HHAST\Php7AnonymousFunction::class : not valid in hack. No attributes
        // if not hack
      ],
      HHAST\INameishNode::class => keyset[
        HHAST\NameToken::class,
        HHAST\QualifiedName::class,
        HHAST\XHPCategoryNameToken::class,
        HHAST\XHPClassNameToken::class,
      ],
      HHAST\INamespaceBody::class => keyset[
        HHAST\NamespaceBody::class,
        HHAST\NamespaceEmptyBody::class,
      ],
      HHAST\INamespaceUseDeclaration::class => keyset[
        HHAST\NamespaceUseDeclaration::class,
        HHAST\NamespaceGroupUseDeclaration::class,
      ],
      HHAST\IParameter::class => keyset[
        HHAST\ParameterDeclaration::class,
        HHAST\VariadicParameter::class,
      ],
      HHAST\IExpression::class => Keyset\union(
        keyset[
          // Constants aren't here as they need to be wrapped in NameExpressions
          HHAST\AnonymousFunction::class,
          HHAST\IHasOperator::class,
          HHAST\VariableToken::class,
          HHAST\XHPChildrenDeclaration::class,
          HHAST\XHPChildrenParenthesizedList::class,
        ],
        Vec\filter(
          $this->getSchema()['AST'],
          $node ==> Str\ends_with($node['kind_name'], 'Expression'),
        )
          |> Keyset\map($$, $node ==> $node['kind_name']),
      ),
      HHAST\ISimpleCreationSpecifier::class => keyset[
        HHAST\SimpleTypeSpecifier::class,
        HHAST\GenericTypeSpecifier::class,
      ],
      HHAST\IStatement::class => Keyset\union(
        keyset[
          HHAST\InclusionDirective::class,
          HHAST\SwitchFallthrough::class,
          HHAST\UsingStatementBlockScoped::class,
          HHAST\UsingStatementFunctionScoped::class,
        ],
        Vec\filter(
          $this->getSchema()['AST'],
          $node ==> Str\ends_with($node['kind_name'], 'Statement'),
        )
          |> Keyset\map($$, $node ==> $node['kind_name']),
      ),
      HHAST\IStringLiteral::class => keyset[
        HHAST\SingleQuotedStringLiteralToken::class,
        HHAST\DoubleQuotedStringLiteralToken::class,
        HHAST\HeredocStringLiteralToken::class,
        HHAST\NowdocStringLiteralToken::class,
      ],
      HHAST\ISwitchLabel::class => keyset[
        HHAST\CaseLabel::class,
        HHAST\DefaultLabel::class,
      ],
      HHAST\ITraitUseItem::class => keyset[
        HHAST\TraitUseAliasItem::class,
        HHAST\TraitUsePrecedenceItem::class,
      ],
      HHAST\ITypeSpecifier::class => Keyset\union(
        keyset[
          HHAST\ReifiedTypeArgument::class,
          // Dubious:
          HHAST\TypeConstant::class,
          HHAST\VariadicParameter::class,
          HHAST\XHPEnumType::class,
        ],
        Vec\filter(
          $this->getSchema()['AST'],
          $node ==> Str\ends_with($node['kind_name'], 'Specifier'),
        )
          |> Keyset\map($$, $node ==> $node['kind_name']),
      ),
      HHAST\IXHPAttribute::class => keyset[
        HHAST\XHPClassAttribute::class,
        HHAST\XHPSimpleAttribute::class,
      ],
      IWrappableWithSimpleTypeSpecifier::class => keyset[
        HHAST\NameToken::class,
        HHAST\NoreturnToken::class,
        HHAST\ParentToken::class,
        HHAST\QualifiedName::class,
        HHAST\SelfToken::class,
        HHAST\StaticToken::class,
        HHAST\ThisToken::class,
        HHAST\VariableToken::class,
        HHAST\XHPClassNameToken::class,
      ],
    ]
      |> Dict\map_keys($$, $key ==> Str\strip_prefix($key, 'Facebook\\HHAST\\'))
      |> Dict\map(
        $$,
        $impls ==> Keyset\map(
          $impls,
          $impl ==> Str\strip_prefix($impl, 'Facebook\\HHAST\\'),
        ),
      );

    foreach ($ifs as $if => $impls) {
      foreach ($impls as $impl) {
        if (Str\starts_with($impl, 'I') && C\contains_key($ifs, $impl)) {
          unset($impls[$impl]);
          $impls = Keyset\union($impls, $ifs[$impl]);
        }
      }
      $ifs[$if] = $impls;
    }
    return $ifs;
  }