|
| 1 | +use internment::ArcIntern; |
| 2 | +use rowan::TextRange; |
| 3 | +use smol_str::SmolStr; |
| 4 | +use std::{hash::Hash, sync::Arc}; |
| 5 | + |
| 6 | +use crate::db_index::LuaSignatureId; |
| 7 | +use crate::{FileId, InFiled}; |
| 8 | + |
| 9 | +use super::super::type_decl::LuaTypeDeclId; |
| 10 | +use super::complex::{ |
| 11 | + GenericTpl, LuaAliasCallType, LuaArrayType, LuaAttributeType, LuaConditionalType, |
| 12 | + LuaFunctionType, LuaGenericType, LuaInstanceType, LuaIntersectionType, LuaMappedType, |
| 13 | + LuaMultiLineUnion, LuaObjectType, LuaStringTplType, LuaTupleType, LuaUnionType, VariadicType, |
| 14 | +}; |
| 15 | + |
| 16 | +#[derive(Debug, Clone)] |
| 17 | +pub enum LuaType { |
| 18 | + Unknown, |
| 19 | + Any, |
| 20 | + Nil, |
| 21 | + Table, |
| 22 | + Userdata, |
| 23 | + Function, |
| 24 | + Thread, |
| 25 | + Boolean, |
| 26 | + String, |
| 27 | + Integer, |
| 28 | + Number, |
| 29 | + Io, |
| 30 | + SelfInfer, |
| 31 | + Global, |
| 32 | + Never, |
| 33 | + BooleanConst(bool), |
| 34 | + StringConst(ArcIntern<SmolStr>), |
| 35 | + IntegerConst(i64), |
| 36 | + FloatConst(f64), |
| 37 | + TableConst(InFiled<TextRange>), |
| 38 | + Ref(LuaTypeDeclId), |
| 39 | + Def(LuaTypeDeclId), |
| 40 | + Array(Arc<LuaArrayType>), |
| 41 | + Tuple(Arc<LuaTupleType>), |
| 42 | + DocFunction(Arc<LuaFunctionType>), |
| 43 | + Object(Arc<LuaObjectType>), |
| 44 | + Union(Arc<LuaUnionType>), |
| 45 | + Intersection(Arc<LuaIntersectionType>), |
| 46 | + Generic(Arc<LuaGenericType>), |
| 47 | + TableGeneric(Arc<Vec<LuaType>>), |
| 48 | + TplRef(Arc<GenericTpl>), |
| 49 | + StrTplRef(Arc<LuaStringTplType>), |
| 50 | + Variadic(Arc<VariadicType>), |
| 51 | + Signature(LuaSignatureId), |
| 52 | + Instance(Arc<LuaInstanceType>), |
| 53 | + DocStringConst(ArcIntern<SmolStr>), |
| 54 | + DocIntegerConst(i64), |
| 55 | + DocBooleanConst(bool), |
| 56 | + Namespace(ArcIntern<SmolStr>), |
| 57 | + Call(Arc<LuaAliasCallType>), |
| 58 | + MultiLineUnion(Arc<LuaMultiLineUnion>), |
| 59 | + TypeGuard(Arc<LuaType>), |
| 60 | + ConstTplRef(Arc<GenericTpl>), |
| 61 | + Language(ArcIntern<SmolStr>), |
| 62 | + ModuleRef(FileId), |
| 63 | + DocAttribute(Arc<LuaAttributeType>), |
| 64 | + Conditional(Arc<LuaConditionalType>), |
| 65 | + ConditionalInfer(ArcIntern<SmolStr>), |
| 66 | + Mapped(Arc<LuaMappedType>), |
| 67 | +} |
| 68 | + |
| 69 | +impl PartialEq for LuaType { |
| 70 | + fn eq(&self, other: &Self) -> bool { |
| 71 | + match (self, other) { |
| 72 | + (LuaType::Unknown, LuaType::Unknown) => true, |
| 73 | + (LuaType::Any, LuaType::Any) => true, |
| 74 | + (LuaType::Nil, LuaType::Nil) => true, |
| 75 | + (LuaType::Table, LuaType::Table) => true, |
| 76 | + (LuaType::Userdata, LuaType::Userdata) => true, |
| 77 | + (LuaType::Function, LuaType::Function) => true, |
| 78 | + (LuaType::Thread, LuaType::Thread) => true, |
| 79 | + (LuaType::Boolean, LuaType::Boolean) => true, |
| 80 | + (LuaType::String, LuaType::String) => true, |
| 81 | + (LuaType::Integer, LuaType::Integer) => true, |
| 82 | + (LuaType::Number, LuaType::Number) => true, |
| 83 | + (LuaType::Io, LuaType::Io) => true, |
| 84 | + (LuaType::SelfInfer, LuaType::SelfInfer) => true, |
| 85 | + (LuaType::Global, LuaType::Global) => true, |
| 86 | + (LuaType::BooleanConst(a), LuaType::BooleanConst(b)) => a == b, |
| 87 | + (LuaType::StringConst(a), LuaType::StringConst(b)) => a == b, |
| 88 | + (LuaType::IntegerConst(a), LuaType::IntegerConst(b)) => a == b, |
| 89 | + (LuaType::FloatConst(a), LuaType::FloatConst(b)) => a == b, |
| 90 | + (LuaType::TableConst(a), LuaType::TableConst(b)) => a == b, |
| 91 | + (LuaType::Ref(a), LuaType::Ref(b)) => a == b, |
| 92 | + (LuaType::Def(a), LuaType::Def(b)) => a == b, |
| 93 | + (LuaType::Array(a), LuaType::Array(b)) => a == b, |
| 94 | + (LuaType::Call(a), LuaType::Call(b)) => a == b, |
| 95 | + (LuaType::Tuple(a), LuaType::Tuple(b)) => a == b, |
| 96 | + (LuaType::DocFunction(a), LuaType::DocFunction(b)) => a == b, |
| 97 | + (LuaType::Object(a), LuaType::Object(b)) => a == b, |
| 98 | + (LuaType::Union(a), LuaType::Union(b)) => a == b, |
| 99 | + (LuaType::Intersection(a), LuaType::Intersection(b)) => a == b, |
| 100 | + (LuaType::Generic(a), LuaType::Generic(b)) => a == b, |
| 101 | + (LuaType::TableGeneric(a), LuaType::TableGeneric(b)) => a == b, |
| 102 | + (LuaType::TplRef(a), LuaType::TplRef(b)) => a == b, |
| 103 | + (LuaType::StrTplRef(a), LuaType::StrTplRef(b)) => a == b, |
| 104 | + (LuaType::Variadic(a), LuaType::Variadic(b)) => a == b, |
| 105 | + (LuaType::DocBooleanConst(a), LuaType::DocBooleanConst(b)) => a == b, |
| 106 | + (LuaType::Signature(a), LuaType::Signature(b)) => a == b, |
| 107 | + (LuaType::Instance(a), LuaType::Instance(b)) => a == b, |
| 108 | + (LuaType::DocStringConst(a), LuaType::DocStringConst(b)) => a == b, |
| 109 | + (LuaType::DocIntegerConst(a), LuaType::DocIntegerConst(b)) => a == b, |
| 110 | + (LuaType::Namespace(a), LuaType::Namespace(b)) => a == b, |
| 111 | + (LuaType::MultiLineUnion(a), LuaType::MultiLineUnion(b)) => a == b, |
| 112 | + (LuaType::TypeGuard(a), LuaType::TypeGuard(b)) => a == b, |
| 113 | + (LuaType::Never, LuaType::Never) => true, |
| 114 | + (LuaType::ConstTplRef(a), LuaType::ConstTplRef(b)) => a == b, |
| 115 | + (LuaType::Language(a), LuaType::Language(b)) => a == b, |
| 116 | + (LuaType::ModuleRef(a), LuaType::ModuleRef(b)) => a == b, |
| 117 | + (LuaType::DocAttribute(a), LuaType::DocAttribute(b)) => a == b, |
| 118 | + (LuaType::Conditional(a), LuaType::Conditional(b)) => a == b, |
| 119 | + (LuaType::ConditionalInfer(a), LuaType::ConditionalInfer(b)) => a == b, |
| 120 | + (LuaType::Mapped(a), LuaType::Mapped(b)) => a == b, |
| 121 | + _ => false, |
| 122 | + } |
| 123 | + } |
| 124 | +} |
| 125 | + |
| 126 | +impl Eq for LuaType {} |
| 127 | + |
| 128 | +impl Hash for LuaType { |
| 129 | + fn hash<H: std::hash::Hasher>(&self, state: &mut H) { |
| 130 | + match self { |
| 131 | + LuaType::Unknown => 0.hash(state), |
| 132 | + LuaType::Any => 1.hash(state), |
| 133 | + LuaType::Nil => 2.hash(state), |
| 134 | + LuaType::Table => 3.hash(state), |
| 135 | + LuaType::Userdata => 4.hash(state), |
| 136 | + LuaType::Function => 5.hash(state), |
| 137 | + LuaType::Thread => 6.hash(state), |
| 138 | + LuaType::Boolean => 7.hash(state), |
| 139 | + LuaType::String => 8.hash(state), |
| 140 | + LuaType::Integer => 9.hash(state), |
| 141 | + LuaType::Number => 10.hash(state), |
| 142 | + LuaType::Io => 11.hash(state), |
| 143 | + LuaType::SelfInfer => 12.hash(state), |
| 144 | + LuaType::Global => 13.hash(state), |
| 145 | + LuaType::BooleanConst(a) => (14, a).hash(state), |
| 146 | + LuaType::StringConst(a) => (15, a).hash(state), |
| 147 | + LuaType::IntegerConst(a) => (16, a).hash(state), |
| 148 | + LuaType::FloatConst(a) => (17, a.to_bits()).hash(state), |
| 149 | + LuaType::TableConst(a) => (18, a).hash(state), |
| 150 | + LuaType::Ref(a) => (19, a).hash(state), |
| 151 | + LuaType::Def(a) => (20, a).hash(state), |
| 152 | + LuaType::Array(a) => (22, a).hash(state), |
| 153 | + LuaType::Call(a) => (23, a).hash(state), |
| 154 | + LuaType::Tuple(a) => (25, a).hash(state), |
| 155 | + LuaType::DocFunction(a) => (26, a).hash(state), |
| 156 | + LuaType::Object(a) => (27, Arc::as_ptr(a)).hash(state), |
| 157 | + LuaType::Union(a) => (28, Arc::as_ptr(a)).hash(state), |
| 158 | + LuaType::Intersection(a) => (29, Arc::as_ptr(a)).hash(state), |
| 159 | + LuaType::Generic(a) => (30, Arc::as_ptr(a)).hash(state), |
| 160 | + LuaType::TableGeneric(a) => (31, Arc::as_ptr(a)).hash(state), |
| 161 | + LuaType::TplRef(a) => (32, Arc::as_ptr(a)).hash(state), |
| 162 | + LuaType::StrTplRef(a) => (33, Arc::as_ptr(a)).hash(state), |
| 163 | + LuaType::Variadic(a) => (34, Arc::as_ptr(a)).hash(state), |
| 164 | + LuaType::DocBooleanConst(a) => (35, a).hash(state), |
| 165 | + LuaType::Signature(a) => (36, a).hash(state), |
| 166 | + LuaType::Instance(a) => (37, a).hash(state), |
| 167 | + LuaType::DocStringConst(a) => (38, a).hash(state), |
| 168 | + LuaType::DocIntegerConst(a) => (39, a).hash(state), |
| 169 | + LuaType::Namespace(a) => (40, a).hash(state), |
| 170 | + LuaType::MultiLineUnion(a) => (43, Arc::as_ptr(a)).hash(state), |
| 171 | + LuaType::TypeGuard(a) => (44, Arc::as_ptr(a)).hash(state), |
| 172 | + LuaType::Never => 45.hash(state), |
| 173 | + LuaType::ConstTplRef(a) => (46, Arc::as_ptr(a)).hash(state), |
| 174 | + LuaType::Language(a) => (47, a).hash(state), |
| 175 | + LuaType::ModuleRef(a) => (48, a).hash(state), |
| 176 | + LuaType::Conditional(a) => (49, Arc::as_ptr(a)).hash(state), |
| 177 | + LuaType::ConditionalInfer(a) => (50, a).hash(state), |
| 178 | + LuaType::Mapped(a) => (51, Arc::as_ptr(a)).hash(state), |
| 179 | + LuaType::DocAttribute(a) => (52, a).hash(state), |
| 180 | + } |
| 181 | + } |
| 182 | +} |
0 commit comments