neo_solidity/cli/standard_json/
standard_json_diagnostics.rs

1pub(crate) fn diagnostic_to_standard_error(
2    diagnostic: &neo_solidity::solidity::Diagnostic,
3    file: &str,
4) -> Value {
5    let severity = match diagnostic.severity {
6        DiagnosticSeverity::Warning => "warning",
7        DiagnosticSeverity::Error => "error",
8    };
9    let code = infer_validation_code(&diagnostic.message, diagnostic.severity);
10
11    json!({
12        "component": "neo-solidity",
13        "severity": severity,
14        "type": "Validation",
15        "code": code,
16        "sourceLocation": { "file": file },
17        "formattedMessage": diagnostic.message,
18        "message": diagnostic.message,
19    })
20}
21
22pub(crate) fn infer_validation_code(message: &str, severity: DiagnosticSeverity) -> &'static str {
23    let msg = message.to_ascii_lowercase();
24
25    if msg.contains("full wildcard manifest permissions") {
26        "MANIFEST_FULL_WILDCARD"
27    } else if msg.contains("wildcard contract manifest permissions") {
28        "MANIFEST_WILDCARD_CONTRACT"
29    } else if msg.contains("wildcard method manifest permissions") {
30        "MANIFEST_WILDCARD_METHODS"
31    } else if msg.contains("duplicate function signature") {
32        "DUPLICATE_SIGNATURE"
33    } else if msg.contains("duplicate parameter name") {
34        "DUPLICATE_PARAMETER_NAME"
35    } else if msg.contains("unsupported type") && msg.contains("parameter") {
36        "UNSUPPORTED_PARAMETER_TYPE"
37    } else if msg.contains("unsupported type") && msg.contains("state variable") {
38        "UNSUPPORTED_STATE_TYPE"
39    } else if msg.contains("unsupported type") && msg.contains("return type") {
40        "UNSUPPORTED_RETURN_TYPE"
41    } else if msg.contains("unsupported type") {
42        "UNSUPPORTED_TYPE"
43    } else if msg.contains("constructor must not specify a return type") {
44        "INVALID_CONSTRUCTOR_RETURN"
45    } else if msg.contains("multiple constructors defined") {
46        "MULTIPLE_CONSTRUCTORS"
47    } else if msg.contains("state variable declared without a name") {
48        "STATE_VARIABLE_NAME_MISSING"
49    } else if msg.contains("duplicate state variable") {
50        "DUPLICATE_STATE_VARIABLE"
51    } else if msg.contains("constant state variable") && msg.contains("must have an initializer") {
52        "CONSTANT_MISSING_INITIALIZER"
53    } else if msg.contains("may not use 'storage'") {
54        "INVALID_STORAGE_PARAM"
55    } else if msg.contains("return value") && msg.contains("storage") {
56        "INVALID_STORAGE_RETURN"
57    } else if msg.contains("returns multiple values") {
58        "MULTIPLE_RETURN_VALUES_UNSUPPORTED"
59    } else if msg.contains("expected") && msg.contains("return") && msg.contains("values") {
60        "RETURN_MISMATCH"
61    } else if msg.contains("returns") && msg.contains("may not map cleanly") {
62        "RETURN_TYPE_UNMAPPED"
63    } else if msg.contains("return type") && msg.contains("unsupported") {
64        "UNSUPPORTED_RETURN_TYPE"
65    } else if msg.contains("event") && msg.contains("exceeds neo abi limits") {
66        "EVENT_PARAM_LIMIT"
67    } else if msg.contains("declares a return type but has no implementation") {
68        "MISSING_IMPLEMENTATION_RETURN"
69    } else {
70        match severity {
71            DiagnosticSeverity::Warning => "VALIDATION_WARNING",
72            DiagnosticSeverity::Error => "VALIDATION_ERROR",
73        }
74    }
75}