Skip to main content

solidity_language_server/solc_ast/
source_units.rs

1//! Source unit (file-level) AST node types.
2
3use serde::{Deserialize, Serialize};
4use std::collections::HashMap;
5
6use super::{
7    ContractDefinition, EnumDefinition, ErrorDefinition, FunctionDefinition, NodeID,
8    StructDefinition, UserDefinedValueTypeDefinition, UsingForDirective, VariableDeclaration,
9};
10
11/// A node that can appear at the top level of a source file.
12///
13/// Discriminated by `nodeType` in the JSON.
14#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)]
15#[serde(tag = "nodeType")]
16pub enum SourceUnitNode {
17    PragmaDirective(PragmaDirective),
18    ImportDirective(ImportDirective),
19    ContractDefinition(ContractDefinition),
20    /// Free (file-level) function.
21    FunctionDefinition(FunctionDefinition),
22    /// File-level struct.
23    StructDefinition(StructDefinition),
24    /// File-level enum.
25    EnumDefinition(EnumDefinition),
26    /// File-level error.
27    ErrorDefinition(ErrorDefinition),
28    /// File-level `using ... for ...`.
29    UsingForDirective(UsingForDirective),
30    /// File-level constant.
31    VariableDeclaration(VariableDeclaration),
32    /// File-level `type ... is ...`.
33    UserDefinedValueTypeDefinition(UserDefinedValueTypeDefinition),
34}
35
36/// A pragma directive (`pragma solidity ^0.8.0;`).
37#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)]
38#[serde(rename_all = "camelCase")]
39pub struct PragmaDirective {
40    pub id: NodeID,
41    pub src: String,
42    #[serde(default)]
43    pub literals: Vec<String>,
44}
45
46/// An import directive.
47#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)]
48#[serde(rename_all = "camelCase")]
49pub struct ImportDirective {
50    pub id: NodeID,
51    pub src: String,
52    /// The import path string.
53    #[serde(default)]
54    pub file: Option<String>,
55    /// Resolved absolute path.
56    #[serde(default)]
57    pub absolute_path: Option<String>,
58    /// Unit alias (`import "..." as Alias`).
59    #[serde(default)]
60    pub unit_alias: Option<String>,
61    #[serde(default)]
62    pub name_location: Option<String>,
63    /// The ID of the imported source unit.
64    #[serde(default)]
65    pub source_unit: Option<NodeID>,
66    /// The scope (containing source unit ID).
67    #[serde(default)]
68    pub scope: Option<NodeID>,
69    /// Symbol aliases (`import { A as B } from "..."`).
70    #[serde(default)]
71    pub symbol_aliases: Vec<serde_json::Value>,
72}
73
74/// A source unit — the root AST node for a single `.sol` file.
75#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)]
76#[serde(rename_all = "camelCase")]
77pub struct SourceUnit {
78    pub id: NodeID,
79    pub src: String,
80    #[serde(default)]
81    pub absolute_path: Option<String>,
82    /// SPDX license identifier.
83    #[serde(default)]
84    pub license: Option<String>,
85    /// Exported symbol name to node ID mapping.
86    #[serde(default)]
87    pub exported_symbols: HashMap<String, Vec<NodeID>>,
88    #[serde(default)]
89    pub nodes: Vec<SourceUnitNode>,
90}