swamp_script_error_report/
parse.rs1use 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}