function properties_from_ast()

in src/consumers/property_from_ast.hack [15:56]


function properties_from_ast(
  ConsumerContext $context,
  HHAST\PropertyDeclaration $outer,
): vec<ScannedProperty> {
  $attributes = attributes_from_ast($outer->getAttributeSpec());
  $doc = doccomment_from_ast($context['definitionContext'], $outer);

  $modifiers = $outer->getModifiers();
  if ($modifiers is HHAST\NodeList<_>) {
    $modifiers = $modifiers->getChildrenOfType(HHAST\Token::class);
  } else {
    $modifiers = vec[$modifiers];
  }
  $has_modifier = (classname<HHAST\Token> $class) ==>
    C\any($modifiers, $m ==> \is_a($m, $class));
  $is_static = $has_modifier(HHAST\StaticToken::class)
    ? StaticityToken::IS_STATIC
    : StaticityToken::NOT_STATIC;
  $visibility = $has_modifier(HHAST\PrivateToken::class)
    ? VisibilityToken::T_PRIVATE
    : (
        $has_modifier(HHAST\ProtectedToken::class)
          ? VisibilityToken::T_PROTECTED
          : VisibilityToken::T_PUBLIC
      );
  $type = typehint_from_ast($context, $outer->getType());

  return Vec\map(
    $outer->getDeclarators()->getChildrenOfItems(),
    $inner ==> new ScannedProperty(
      $inner,
      Str\strip_prefix($inner->getName()->getText(), '$'),
      context_with_node_position($context, $inner)['definitionContext'],
      $attributes,
      $doc,
      $type,
      $visibility,
      $is_static,
      value_from_ast($inner->getInitializer()?->getValue()),
    ),
  );
}