1use super::{EvalStackTraceItem, ValueData};
2use crate::ast;
3use crate::lexer::LexError;
4use crate::parser::ParseError;
5use crate::span::SpanId;
6
7#[derive(Clone, Debug)]
8pub enum AnalyzeError {
9 UnknownVariable {
10 span: SpanId,
11 name: String,
12 },
13 SelfOutsideObject {
14 self_span: SpanId,
15 },
16 SuperOutsideObject {
17 super_span: SpanId,
18 },
19 DollarOutsideObject {
20 dollar_span: SpanId,
21 },
22 RepeatedLocalName {
23 original_span: SpanId,
24 repeated_span: SpanId,
25 name: String,
26 },
27 RepeatedFieldName {
28 original_span: SpanId,
29 repeated_span: SpanId,
30 name: String,
31 },
32 RepeatedParamName {
33 original_span: SpanId,
34 repeated_span: SpanId,
35 name: String,
36 },
37 PositionalArgAfterNamed {
38 arg_span: SpanId,
39 },
40 TextBlockAsImportPath {
41 span: SpanId,
42 },
43 ComputedImportPath {
44 span: SpanId,
45 },
46}
47
48#[derive(Clone, Debug, PartialEq, Eq)]
49pub struct EvalError {
50 pub stack_trace: Vec<EvalStackTraceItem>,
51 pub kind: EvalErrorKind,
52}
53
54#[derive(Clone, Debug, PartialEq, Eq)]
55pub enum EvalErrorKind {
56 StackOverflow,
57 InfiniteRecursion,
58 InvalidIndexedType {
59 span: SpanId,
60 got_type: EvalErrorValueType,
61 },
62 InvalidSlicedType {
63 span: SpanId,
64 got_type: EvalErrorValueType,
65 },
66 SliceIndexOrStepIsNotNumber {
67 span: SpanId,
68 got_type: EvalErrorValueType,
69 },
70 StringIndexIsNotNumber {
71 span: SpanId,
72 got_type: EvalErrorValueType,
73 },
74 ArrayIndexIsNotNumber {
75 span: SpanId,
76 got_type: EvalErrorValueType,
77 },
78 NumericIndexIsNotValid {
79 span: SpanId,
80 index: String,
81 },
82 NumericIndexOutOfRange {
83 span: SpanId,
84 index: usize,
85 length: usize,
86 },
87 ObjectIndexIsNotString {
88 span: SpanId,
89 got_type: EvalErrorValueType,
90 },
91 RepeatedFieldName {
92 span: SpanId,
93 name: String,
94 },
95 FieldNameIsNotString {
96 span: SpanId,
97 got_type: EvalErrorValueType,
98 },
99 UnknownObjectField {
100 span: SpanId,
101 field_name: String,
102 },
103 FieldOfNonObject {
104 span: SpanId,
105 },
106 SuperWithoutSuperObject {
107 span: SpanId,
108 },
109 ForSpecValueIsNotArray {
110 span: SpanId,
111 got_type: EvalErrorValueType,
112 },
113 CondIsNotBool {
114 span: SpanId,
115 got_type: EvalErrorValueType,
116 },
117 CalleeIsNotFunction {
118 span: Option<SpanId>,
119 got_type: EvalErrorValueType,
120 },
121 TooManyCallArgs {
122 span: Option<SpanId>,
123 num_params: usize,
124 },
125 UnknownCallParam {
126 span: Option<SpanId>,
127 param_name: String,
128 },
129 RepeatedCallParam {
130 span: Option<SpanId>,
131 param_name: String,
132 },
133 CallParamNotBound {
134 span: Option<SpanId>,
135 param_name: String,
136 },
137 NativeCallFailed,
138 InvalidUnaryOpType {
139 span: SpanId,
140 op: ast::UnaryOp,
141 rhs_type: EvalErrorValueType,
142 },
143 InvalidBinaryOpTypes {
144 span: Option<SpanId>,
145 op: ast::BinaryOp,
146 lhs_type: EvalErrorValueType,
147 rhs_type: EvalErrorValueType,
148 },
149 NumberNotBitwiseSafe {
150 span: Option<SpanId>,
151 },
152 NumberOverflow {
153 span: Option<SpanId>,
154 },
155 NumberNan {
156 span: Option<SpanId>,
157 },
158 DivByZero {
159 span: Option<SpanId>,
160 },
161 ShiftByNegative {
162 span: Option<SpanId>,
163 },
164 InvalidStdFuncArgType {
165 func_name: String,
166 arg_index: usize,
167 expected_types: Vec<EvalErrorValueType>,
168 got_type: EvalErrorValueType,
169 },
170 AssertFailed {
171 span: SpanId,
172 message: Option<String>,
173 },
174 AssertEqualFailed {
175 lhs: String,
176 rhs: String,
177 },
178 ExplicitError {
179 span: SpanId,
180 message: String,
181 },
182 ImportFailed {
183 span: SpanId,
184 path: String,
185 },
186 UnknownExtVar {
187 name: String,
188 },
189 ManifestFunction,
190 CompareNullInequality,
191 CompareBooleanInequality,
192 CompareObjectInequality,
193 CompareFunctions,
194 CompareDifferentTypesInequality {
195 lhs_type: EvalErrorValueType,
196 rhs_type: EvalErrorValueType,
197 },
198 PrimitiveEqualsNonPrimitive {
199 got_type: EvalErrorValueType,
200 },
201 Other {
202 span: Option<SpanId>,
203 message: String,
204 },
205}
206
207#[derive(Copy, Clone, Debug, PartialEq, Eq)]
208pub enum EvalErrorValueType {
209 Null,
210 Bool,
211 Number,
212 String,
213 Array,
214 Object,
215 Function,
216}
217
218impl EvalErrorValueType {
219 pub(super) fn from_value(value: &ValueData<'_>) -> Self {
220 match value {
221 ValueData::Null => Self::Null,
222 ValueData::Bool(_) => Self::Bool,
223 ValueData::Number(_) => Self::Number,
224 ValueData::String(_) => Self::String,
225 ValueData::Array(_) => Self::Array,
226 ValueData::Object(_) => Self::Object,
227 ValueData::Function(_) => Self::Function,
228 }
229 }
230
231 pub(super) fn to_str(self) -> &'static str {
232 match self {
233 Self::Null => "null",
234 Self::Bool => "boolean",
235 Self::Number => "number",
236 Self::String => "string",
237 Self::Array => "array",
238 Self::Object => "object",
239 Self::Function => "function",
240 }
241 }
242}
243
244#[derive(Debug)]
245pub enum LoadError {
246 Lex(LexError),
247 Parse(ParseError),
248 Analyze(AnalyzeError),
249}
250
251impl From<LexError> for LoadError {
252 #[inline]
253 fn from(err: LexError) -> Self {
254 Self::Lex(err)
255 }
256}
257
258impl From<ParseError> for LoadError {
259 #[inline]
260 fn from(err: ParseError) -> Self {
261 Self::Parse(err)
262 }
263}
264
265impl From<AnalyzeError> for LoadError {
266 #[inline]
267 fn from(err: AnalyzeError) -> Self {
268 Self::Analyze(err)
269 }
270}