1use crate::{Builder, Report, build_and_print};
6use eira::Kind;
7use source_map_cache::SourceMap;
8use source_map_node::Span;
9use std::path::Path;
10use swamp_dep_loader::ParserError;
11use swamp_parser::SpecificError;
12
13#[must_use]
14pub fn build_parse_error(err: &SpecificError, span: &Span) -> Builder<usize> {
15 let mut b = match err {
16 SpecificError::General(general) => Report::build(
17 Kind::Error,
18 1,
19 &format!("General Parse Error: {general}"),
20 span,
21 ),
22
23 SpecificError::MissingTypeName => Report::build(Kind::Error, 1, "missing type name", span),
24 SpecificError::UnknownEscapeCharacter(char) => Report::build(
25 Kind::Error,
26 1,
27 &format!("Unknown escape character '{char}'"),
28 span,
29 ),
30 SpecificError::UnfinishedEscapeSequence => {
31 Report::build(Kind::Error, 1, "Unfinished escape sequence", span)
32 }
33 SpecificError::InvalidUnicodeEscape => {
34 Report::build(Kind::Error, 1, "invalid unicode escape sequence", span)
35 }
36 SpecificError::InvalidHexEscape => {
37 Report::build(Kind::Error, 1, "invalid hex escape sequence", span)
38 }
39 SpecificError::InvalidUtf8Sequence => {
40 Report::build(Kind::Error, 1, "invalid utf-8 escape sequence", span)
41 }
42 SpecificError::ExpectingTypeIdentifier => todo!(),
43 SpecificError::ExpectingInnerPair => todo!(),
44 SpecificError::UnexpectedTypeRule(wrong_rule) => {
45 Report::build(Kind::Error, 1, "unexpected type rule", span)
46 .with_note(&format!("rule: {wrong_rule}"))
47 }
48 SpecificError::ExpectedTypeIdentifier(_) => todo!(),
49 SpecificError::ExpectedLocalTypeIdentifier(_) => todo!(),
50 SpecificError::UnexpectedRuleInParseScript(rule) => Report::build(
51 Kind::Error,
52 1,
53 &format!("unexpected type rule {rule}"),
54 span,
55 ),
56 SpecificError::ExpectedControlStatement(_) => todo!(),
57 SpecificError::ExpectedStatement(_) => todo!(),
58 SpecificError::ExpectedIfOrElse(_) => todo!(),
59 SpecificError::MissingFunctionSignature => todo!(),
60 SpecificError::MissingFunctionBody => todo!(),
61 SpecificError::ExpectedStatementBlock => todo!(),
62 SpecificError::ExpectedFunctionDefinition => todo!(),
63 SpecificError::ExpectedParameter => todo!(),
64 SpecificError::ExpectedImplItem => todo!(),
65 SpecificError::ExpectedMemberSignature => todo!(),
66 SpecificError::ExpectedBlockInWhileLoop => todo!(),
67 SpecificError::UnexpectedExpressionType(_) => todo!(),
68 SpecificError::UnexpectedAccessType(_) => todo!(),
69 SpecificError::UnknownAssignmentOperator(_) => todo!(),
70 SpecificError::CompoundOperatorCanNotContainMut => todo!(),
71 SpecificError::InvalidAssignmentTarget => {
72 Report::build(Kind::Error, 1, "invalid assignment target", span)
73 }
74 SpecificError::CompoundOperatorCanNotHaveMultipleVariables => todo!(),
75 SpecificError::ExpectedExpressionAfterPrefixOperator => todo!(),
76 SpecificError::UnknownOperator(_) => {
77 Report::build(Kind::Error, 1, "unknown operator", span)
78 }
79 SpecificError::UnexpectedPostfixOperator => todo!(),
80 SpecificError::UnexpectedUnaryOperator(_) => todo!(),
81 SpecificError::InvalidMemberCall => todo!(),
82 SpecificError::UnknownMatchType => todo!(),
83 SpecificError::UnexpectedElementInPatternList => todo!(),
84 SpecificError::InvalidPrecisionValue => todo!(),
85 SpecificError::InvalidPrecisionType => todo!(),
86 SpecificError::ExpectedTypeIdentifierAfterPath => todo!(),
87 SpecificError::UnexpectedPatternListElement(_) => todo!(),
88 SpecificError::MustHaveAtLeastOneArm => todo!(),
89 SpecificError::UnexpectedMatchArmRule(_) => todo!(),
90 SpecificError::UnknownEnumVariant(_) => todo!(),
91 SpecificError::UnknownLiteral => todo!(),
92 SpecificError::UnknownPrimary(_) => todo!(),
93 SpecificError::InvalidFormatSpecifier => todo!(),
94 SpecificError::UnexpectedVariantField => {
95 Report::build(Kind::Error, 321, "unexpected variant field", span)
96 }
97 SpecificError::MutOnlyForVariables => todo!(),
98 SpecificError::UnexpectedTokenInFunctionCall => todo!(),
99 SpecificError::ExpectedExpressionInInterpolation => todo!(),
100 SpecificError::UnexpectedRuleInInterpolation => todo!(),
101 SpecificError::ExpectedForPattern => todo!(),
102 SpecificError::ExpectedBlock => Report::build(Kind::Error, 321, "ExpectedBlock", span),
103 SpecificError::InvalidForPattern => todo!(),
104 SpecificError::UnexpectedRuleInElse(_) => todo!(),
105 SpecificError::ExpectedLocationExpression => todo!(),
106 SpecificError::ExpectedImportPath => todo!(),
107 SpecificError::ExpectedIdentifier => todo!(),
108 SpecificError::ExpectedIdentifierAfterPath => todo!(),
109 SpecificError::ExpectedFieldOrRest => todo!(),
110 SpecificError::UnknownTerm(term) => Report::build(Kind::Error, 32241, "UnknownTerm", span)
111 .with_note(&format!("term {term}")),
112 SpecificError::UnknownExpr(_) => todo!(),
113 SpecificError::CouldNotMoveDown
114 | SpecificError::CouldNotMoveRight
115 | SpecificError::UnexpectedTokenInMutableExpression => todo!(),
116 };
117
118 b.error_module = "P".to_string();
119 b
120}
121
122pub fn show_parse_error(
123 err: &SpecificError,
124 span: &Span,
125 source_map: &SourceMap,
126 current_dir: &Path,
127) {
128 let builder = build_parse_error(err, span);
129 build_and_print(builder, source_map, current_dir);
130}
131
132#[must_use]
133pub fn build_parser_error(err: &ParserError) -> Builder<usize> {
134 build_parse_error(
135 &err.specific,
136 &Span {
137 file_id: err.file_id,
138 offset: err.node.span.offset,
139 length: err.node.span.length,
140 },
141 )
142}
143
144pub fn show_parser_error(err: &ParserError, source_map: &SourceMap, current_dir: &Path) {
145 let builder = build_parser_error(err);
146 build_and_print(builder, source_map, current_dir);
147}