Skip to main content

solidity_language_server/solc_ast/
functions.rs

1//! Function, modifier, and parameter list AST node types.
2
3use serde::{Deserialize, Serialize};
4
5use super::{
6    Documentation, Expression, FunctionKind, IdentifierPath, ModifierInvocationKind, NodeID,
7    StateMutability, Statement, TypeName, VariableDeclaration, Visibility,
8};
9
10/// A function definition.
11#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)]
12#[serde(rename_all = "camelCase")]
13pub struct FunctionDefinition {
14    pub id: NodeID,
15    pub src: String,
16    pub name: String,
17    #[serde(default)]
18    pub name_location: Option<String>,
19    #[serde(default)]
20    pub documentation: Option<Documentation>,
21    pub kind: FunctionKind,
22    pub state_mutability: StateMutability,
23    #[serde(default)]
24    pub visibility: Option<Visibility>,
25    #[serde(rename = "virtual", default)]
26    pub is_virtual: Option<bool>,
27    #[serde(default)]
28    pub overrides: Option<OverrideSpecifier>,
29    pub parameters: ParameterList,
30    pub return_parameters: ParameterList,
31    #[serde(default)]
32    pub modifiers: Vec<ModifierInvocation>,
33    /// The function body. `None` for interface/abstract functions.
34    #[serde(default)]
35    pub body: Option<Statement>,
36    #[serde(default)]
37    pub implemented: Option<bool>,
38    #[serde(default)]
39    pub scope: Option<NodeID>,
40    /// 4-byte function selector (hex string, no `0x` prefix).
41    #[serde(default)]
42    pub function_selector: Option<String>,
43    /// Base functions this function overrides.
44    #[serde(default)]
45    pub base_functions: Option<Vec<NodeID>>,
46}
47
48/// A parameter list (used for function params and return params).
49#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)]
50#[serde(rename_all = "camelCase")]
51pub struct ParameterList {
52    pub id: NodeID,
53    pub src: String,
54    #[serde(default)]
55    pub parameters: Vec<VariableDeclaration>,
56}
57
58/// A modifier definition.
59#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)]
60#[serde(rename_all = "camelCase")]
61pub struct ModifierDefinition {
62    pub id: NodeID,
63    pub src: String,
64    pub name: String,
65    #[serde(default)]
66    pub name_location: Option<String>,
67    #[serde(default)]
68    pub documentation: Option<Documentation>,
69    #[serde(default)]
70    pub visibility: Option<Visibility>,
71    pub parameters: ParameterList,
72    #[serde(rename = "virtual", default)]
73    pub is_virtual: Option<bool>,
74    #[serde(default)]
75    pub overrides: Option<OverrideSpecifier>,
76    /// The modifier body. `None` for abstract modifiers.
77    #[serde(default)]
78    pub body: Option<Statement>,
79    /// Base modifiers this modifier overrides.
80    #[serde(default)]
81    pub base_modifiers: Option<Vec<NodeID>>,
82}
83
84/// A modifier invocation (or base constructor specifier) on a function.
85#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)]
86#[serde(rename_all = "camelCase")]
87pub struct ModifierInvocation {
88    pub id: NodeID,
89    pub src: String,
90    pub modifier_name: IdentifierPath,
91    #[serde(default)]
92    pub arguments: Option<Vec<Expression>>,
93    #[serde(default)]
94    pub kind: Option<ModifierInvocationKind>,
95}
96
97/// An override specifier (`override` or `override(A, B)`).
98#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)]
99#[serde(rename_all = "camelCase")]
100pub struct OverrideSpecifier {
101    pub id: NodeID,
102    pub src: String,
103    #[serde(default)]
104    pub overrides: Vec<TypeName>,
105}