/* called by TypeAliasReq to get resolved TypeStructure for type aliases */ Array TypeStructure::resolve(const String& aliasName, const Array& arr) { // use a bogus constant to store the name Class::Const cns; cns.m_name = aliasName.get(); auto newarr = resolveTS(arr, cns, nullptr); newarr.add(s_alias, Variant(aliasName)); newarr.setEvalScalar(); return newarr; }
Array TypeAnnotation::getScalarArrayRep() const { auto rep = Array::Create(); bool nullable = (bool) m_nullable; if (nullable) { rep.add(s_nullable, true_varNR); } bool allowsUnknownFields = (bool) m_allowsUnknownFields; if (allowsUnknownFields) { rep.add(s_allows_unknown_fields, true_varNR); } TypeStructure::Kind kind = getKind(); rep.add(s_kind, Variant(static_cast<uint8_t>(kind))); switch (kind) { case TypeStructure::Kind::T_tuple: assert(m_typeArgs); rep.add(s_elem_types, Variant(argsListToScalarArray(m_typeArgs))); break; case TypeStructure::Kind::T_fun: assert(m_typeArgs); // return type is the first of the typeArgs rep.add(s_return_type, Variant(m_typeArgs->getScalarArrayRep())); rep.add(s_param_types, Variant(argsListToScalarArray(m_typeArgs->m_typeList))); break; case TypeStructure::Kind::T_array: case TypeStructure::Kind::T_dict: case TypeStructure::Kind::T_vec: case TypeStructure::Kind::T_keyset: if (m_typeArgs) { rep.add(s_generic_types, Variant(argsListToScalarArray(m_typeArgs))); } break; case TypeStructure::Kind::T_shape: shapeFieldsToScalarArray(rep, m_typeArgs); break; case TypeStructure::Kind::T_typevar: rep.add(s_name, Variant(m_name)); break; case TypeStructure::Kind::T_typeaccess: { // for now, only store the vanilla names (strings) as part of the // access list rep.add(s_root_name, Variant(m_name)); auto accList = Array::Create(); auto typeEl = m_typeArgs; int i = 0; while (typeEl) { accList.add(i, Variant(typeEl->vanillaName())); ++i; typeEl = typeEl->m_typeList; } rep.add(s_access_list, Variant(accList)); break; } case TypeStructure::Kind::T_xhp: rep.add(s_classname, Variant(m_name)); break; case TypeStructure::Kind::T_unresolved: rep.add(s_classname, Variant(m_name)); if (m_typeArgs) { rep.add(s_generic_types, Variant(argsListToScalarArray(m_typeArgs))); } break; default: break; } if (!m_generics.empty()) { rep.add(s_typevars, Variant(m_generics)); } rep.setEvalScalar(); return rep; }