swamp_script_error_report/
parse.rs

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