swamp_error_report/
parse.rs

1/*
2 * Copyright (c) Peter Bjorklund. All rights reserved. https://github.com/swamp/swamp
3 * Licensed under the MIT License. See LICENSE in the project root for license information.
4 */
5use 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}