swamp_script_error_report/
analyze.rs

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_label("first_type", a.clone())
83                .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
200/// # Panics
201///
202pub 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}