neo_solidity/cli/standard_json/
standard_json_diagnostics.rs1pub(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}