1use crate::semantic::build_semantic_error;
2use crate::{Builder, Report, build_and_print};
3use eira::Kind;
4use std::path::Path;
5use swamp_script_analyzer::err::{Error, ErrorKind};
6use swamp_script_source_map::SourceMap;
7
8#[must_use]
9#[allow(clippy::too_many_lines)]
10pub fn build_analyzer_error(err: &Error) -> Builder<usize> {
11 let span = &err.node.span;
12 let mut b = match &err.kind {
13 ErrorKind::ExpectedLambda => Report::build(Kind::Error, 2, "expected lambda", span),
14 ErrorKind::UnknownEnumType => Report::build(Kind::Error, 1, "unknown enum type", span),
15 ErrorKind::TooManyDestructureVariables => {
16 Report::build(Kind::Error, 2, "too many destructure variables", span)
17 }
18 ErrorKind::CanNotDestructure => Report::build(Kind::Error, 3, "can not destructure", span),
19 ErrorKind::UnknownConstant => Report::build(Kind::Error, 4, "unknown constant", span),
20 ErrorKind::UnknownStructTypeReference => {
21 Report::build(Kind::Error, 5, "unknown struct type reference", span)
22 }
23 ErrorKind::DuplicateFieldName => {
24 Report::build(Kind::Error, 6, "duplicate field name", span)
25 }
26 ErrorKind::MissingFieldInStructInstantiation(fields, _struct_type) => {
27 Report::build(Kind::Error, 7, "missing fields in instantiation", span)
28 .with_note(&format!("fields: {fields:?}"))
29 }
30 ErrorKind::UnknownVariable => Report::build(Kind::Error, 8, "unknown variable", span),
31 ErrorKind::OverwriteVariableWithAnotherType => {
32 Report::build(Kind::Error, 9, "overwrite variable with another type", span)
33 }
34 ErrorKind::WrongNumberOfArguments(_expected, _encountered) => {
35 Report::build(Kind::Error, 10, "wrong number of arguments", span)
36 }
37 ErrorKind::CanOnlyOverwriteVariableWithMut => Report::build(
38 Kind::Error,
39 11,
40 "overwrite requires variable to be mut",
41 span,
42 ),
43 ErrorKind::UnknownEnumVariantType => {
44 Report::build(Kind::Error, 12, "unknown enum variant type", span)
45 }
46 ErrorKind::UnknownStructField => {
47 Report::build(Kind::Error, 13, "unknown struct field reference", span)
48 }
49 ErrorKind::UnknownEnumVariantTypeInPattern => Report::build(
50 Kind::Error,
51 14,
52 "unknown enum variant type in pattern",
53 span,
54 ),
55 ErrorKind::ExpectedEnumInPattern => {
56 Report::build(Kind::Error, 15, "expected enum in pattern", span)
57 }
58 ErrorKind::WrongEnumVariantContainer(_) => {
59 Report::build(Kind::Error, 16, "wrong enum variant", span)
60 }
61 ErrorKind::VariableIsNotMutable => {
62 Report::build(Kind::Error, 17, "variable is not mutable", span)
63 }
64 ErrorKind::ArgumentIsNotMutable => {
65 Report::build(Kind::Error, 18, "argument is not mutable", span)
66 }
67 ErrorKind::UnknownTypeReference => {
68 Report::build(Kind::Error, 19, "unknown type reference", span)
69 }
70 ErrorKind::SemanticError(semantic_error) => build_semantic_error(semantic_error, span),
71 ErrorKind::ExpectedOptional => {
72 Report::build(Kind::Error, 20, "expected optional type", span)
73 }
74 ErrorKind::MapKeyTypeMismatch { .. } => {
75 Report::build(Kind::Error, 21, "map key type mismatch", span)
76 }
77 ErrorKind::MapValueTypeMismatch { .. } => {
78 Report::build(Kind::Error, 22, "map value type mismatch", span)
79 }
80 ErrorKind::IncompatibleTypes { expected, found } => {
81 Report::build(Kind::Error, 23, "incompatible types", span)
82 .with_note(&format!(
84 "required_type: {expected}, encountered type: {found}"
85 ))
86 }
87 ErrorKind::UnknownMemberFunction => {
88 Report::build(Kind::Error, 24, "unknown member function", span)
89 }
90 ErrorKind::ExpressionsNotAllowedInLetPattern => Report::build(
91 Kind::Error,
92 25,
93 "expressions not allowed in let pattern",
94 span,
95 ),
96 ErrorKind::UnknownField => Report::build(Kind::Error, 26, "unknown field", span),
97 ErrorKind::EnumVariantHasNoFields => {
98 Report::build(Kind::Error, 27, "enum variant has no fields", span)
99 }
100 ErrorKind::TooManyTupleFields { .. } => {
101 Report::build(Kind::Error, 28, "too many tuple fields", span)
102 }
103 ErrorKind::ExpectedBooleanExpression => {
104 Report::build(Kind::Error, 29, "expected boolean expression", span)
105 }
106 ErrorKind::NotAnIterator => Report::build(Kind::Error, 30, "not an iterator", span),
107 ErrorKind::IntConversionError(_) => {
108 Report::build(Kind::Error, 31, "int conversion error", span)
109 }
110 ErrorKind::FloatConversionError(_) => {
111 Report::build(Kind::Error, 32, "float conversion error", span)
112 }
113 ErrorKind::BoolConversionError => {
114 Report::build(Kind::Error, 33, "bool conversion error", span)
115 }
116 ErrorKind::DuplicateFieldInStructInstantiation(_) => {
117 Report::build(Kind::Error, 34, "duplicate field in struct literal", span)
118 }
119 ErrorKind::NoDefaultImplemented(_resolved_type) => {
120 Report::build(Kind::Error, 35, "no default() function", span)
121 }
122 ErrorKind::GuardHasNoType => Report::build(Kind::Error, 36, "guard has no type", span),
123 ErrorKind::NoneNeedsExpectedTypeHint => {
124 Report::build(Kind::Error, 37, "none needs expected type hint", span)
125 }
126 ErrorKind::NotValidLocationStartingPoint => {
127 Report::build(Kind::Error, 38, "not valid location starting point", span)
128 }
129 ErrorKind::CallsCanNotBePartOfChain
130 | ErrorKind::UnwrapCanNotBePartOfChain
131 | ErrorKind::NoneCoalesceCanNotBePartOfChain => {
132 Report::build(Kind::Error, 9904, "chain error", span)
133 }
134
135 ErrorKind::SelfNotCorrectType => Report::build(Kind::Error, 9901, "chain error", span),
136 ErrorKind::CanNotNoneCoalesce => {
137 Report::build(Kind::Error, 39, "can not coalesce to none", span)
138 }
139 &ErrorKind::GuardCanNotHaveMultipleWildcards
140 | &ErrorKind::WildcardMustBeLastInGuard
141 | &ErrorKind::GuardMustHaveWildcard => {
142 Report::build(Kind::Error, 9902, "guard error", span)
143 }
144 ErrorKind::UnknownModule => Report::build(Kind::Error, 40, "unknown module", span),
145 ErrorKind::UnknownSymbol => Report::build(Kind::Error, 41, "unknown symbol", span),
146 ErrorKind::NoAssociatedFunction(_, _) => {
147 Report::build(Kind::Error, 42, "no associated function", span)
148 }
149 ErrorKind::MissingSubscriptMember => {
150 Report::build(Kind::Error, 43, "missing subscript member", span)
151 }
152 ErrorKind::UnusedVariablesCanNotBeMut => {
153 Report::build(Kind::Error, 44, "unused variables must not be mut", span)
154 }
155 ErrorKind::UnknownIdentifier(x) => {
156 Report::build(Kind::Error, 45, "unknown identifier", span)
157 .with_note(&format!("identifier: {x}"))
158 }
159 ErrorKind::VariableTypeMustBeConcrete => {
160 Report::build(Kind::Error, 46, "variable type must be concrete", span)
161 }
162 ErrorKind::ArrayIndexMustBeInt(_) => {
163 Report::build(Kind::Error, 47, "array index must be int", span)
164 }
165 ErrorKind::ExpectedMutableLocation => {
166 Report::build(Kind::Error, 48, "expected mutable location", span)
167 }
168 ErrorKind::OverwriteVariableNotAllowedHere => {
169 Report::build(Kind::Error, 49, "overwrite variable not allowed here", span)
170 }
171 ErrorKind::BreakOutsideLoop => Report::build(Kind::Error, 50, "break outside loop", span),
172 ErrorKind::ReturnOutsideCompare => {
173 Report::build(Kind::Error, 51, "return outside compare", span)
174 }
175 ErrorKind::EmptyMatch => Report::build(Kind::Error, 52, "empty match", span),
176 ErrorKind::MatchArmsMustHaveTypes => {
177 Report::build(Kind::Error, 53, "match arms must have types", span)
178 }
179 ErrorKind::ContinueOutsideLoop => {
180 Report::build(Kind::Error, 54, "continue outside loop", span)
181 }
182 ErrorKind::ParameterIsNotMutable => {
183 Report::build(Kind::Error, 55, "parameter is not mutable", span)
184 }
185 ErrorKind::CouldNotCoerceTo(_) => {
186 Report::build(Kind::Error, 56, "could not coerce to", span)
187 }
188 ErrorKind::UnexpectedType => Report::build(Kind::Error, 57, "unexpected type", span),
189 ErrorKind::CanNotAttachFunctionsToType => {
190 Report::build(Kind::Error, 58, "can not attach functions to type", span)
191 }
192 ErrorKind::MissingMemberFunction(_) => {
193 Report::build(Kind::Error, 59, "missing member function", span)
194 }
195 };
196 b.error_module = "A".to_string();
197 b
198}
199
200pub fn show_analyzer_error(err: &Error, source_map: &SourceMap, current_dir: &Path) {
203 let builder = build_analyzer_error(err);
204 build_and_print(builder, source_map, current_dir);
205}