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 NumberOverflow {
150 span: Option<SpanId>,
151 },
152 NumberNan {
153 span: Option<SpanId>,
154 },
155 DivByZero {
156 span: Option<SpanId>,
157 },
158 ShiftByNegative {
159 span: Option<SpanId>,
160 },
161 InvalidStdFuncArgType {
162 func_name: String,
163 arg_index: usize,
164 expected_types: Vec<EvalErrorValueType>,
165 got_type: EvalErrorValueType,
166 },
167 AssertFailed {
168 span: SpanId,
169 message: Option<String>,
170 },
171 AssertEqualFailed {
172 lhs: String,
173 rhs: String,
174 },
175 ExplicitError {
176 span: SpanId,
177 message: String,
178 },
179 ImportFailed {
180 span: SpanId,
181 path: String,
182 },
183 UnknownExtVar {
184 name: String,
185 },
186 ManifestFunction,
187 CompareNullInequality,
188 CompareBooleanInequality,
189 CompareObjectInequality,
190 CompareFunctions,
191 CompareDifferentTypesInequality {
192 lhs_type: EvalErrorValueType,
193 rhs_type: EvalErrorValueType,
194 },
195 PrimitiveEqualsNonPrimitive {
196 got_type: EvalErrorValueType,
197 },
198 Other {
199 span: Option<SpanId>,
200 message: String,
201 },
202}
203
204#[derive(Copy, Clone, Debug, PartialEq, Eq)]
205pub enum EvalErrorValueType {
206 Null,
207 Bool,
208 Number,
209 String,
210 Array,
211 Object,
212 Function,
213}
214
215impl EvalErrorValueType {
216 pub(super) fn from_value(value: &ValueData<'_>) -> Self {
217 match value {
218 ValueData::Null => Self::Null,
219 ValueData::Bool(_) => Self::Bool,
220 ValueData::Number(_) => Self::Number,
221 ValueData::String(_) => Self::String,
222 ValueData::Array(_) => Self::Array,
223 ValueData::Object(_) => Self::Object,
224 ValueData::Function(_) => Self::Function,
225 }
226 }
227
228 pub(super) fn to_str(self) -> &'static str {
229 match self {
230 Self::Null => "null",
231 Self::Bool => "boolean",
232 Self::Number => "number",
233 Self::String => "string",
234 Self::Array => "array",
235 Self::Object => "object",
236 Self::Function => "function",
237 }
238 }
239}
240
241#[derive(Debug)]
242pub enum LoadError {
243 Lex(LexError),
244 Parse(ParseError),
245 Analyze(AnalyzeError),
246}
247
248impl From<LexError> for LoadError {
249 #[inline]
250 fn from(err: LexError) -> Self {
251 Self::Lex(err)
252 }
253}
254
255impl From<ParseError> for LoadError {
256 #[inline]
257 fn from(err: ParseError) -> Self {
258 Self::Parse(err)
259 }
260}
261
262impl From<AnalyzeError> for LoadError {
263 #[inline]
264 fn from(err: AnalyzeError) -> Self {
265 Self::Analyze(err)
266 }
267}