use ra_ap_syntax::{Edition, SourceFile};
use crate::{
ChainExtension, Contract, ContractRef, Error, EventV2, InkE2ETest, InkTest, StorageItem,
TraitDefinition,
};
#[ink_analyzer_macro::entity]
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct InkFile {
ast: SourceFile,
contracts: Vec<Contract>,
#[initializer(peek_macro = Contract)]
events_v2: Vec<EventV2>,
#[initializer(peek_macro = Contract)]
errors: Vec<Error>,
#[initializer(peek_macro = Contract)]
contract_refs: Vec<ContractRef>,
#[initializer(peek_macro = Contract)]
trait_definitions: Vec<TraitDefinition>,
#[initializer(peek_macro = Contract)]
chain_extensions: Vec<ChainExtension>,
#[initializer(peek_macro = Contract)]
storage_items: Vec<StorageItem>,
tests: Vec<InkTest>,
e2e_tests: Vec<InkE2ETest>,
}
impl InkFile {
pub fn parse(code: &str) -> Self {
<Self as From<SourceFile>>::from(SourceFile::parse(code, Edition::Edition2021).tree())
}
}
#[cfg(test)]
mod tests {
use super::*;
use test_utils::quote_as_str;
#[test]
fn parse_works() {
let file = InkFile::parse(quote_as_str! {
#[ink::contract]
mod my_contract {
}
#[ink::event]
pub struct MyEvent {
}
#[ink::error]
pub struct Error;
#[ink::contract_ref]
pub trait Callee {
}
#[ink::trait_definition]
pub trait MyTrait {
}
#[ink::chain_extension]
pub trait MyChainExtension {
}
#[ink::storage_item]
struct MyStorageItem {
}
#[ink::storage_item]
struct MyStorageItem2 {
}
#[cfg(test)]
mod tests {
#[ink::test]
fn it_works {
}
#[ink::test]
fn it_works2 {
}
}
});
assert_eq!(file.contracts().len(), 1);
assert_eq!(file.events_v2().len(), 1);
assert_eq!(file.errors().len(), 1);
assert_eq!(file.contract_refs().len(), 1);
assert_eq!(file.trait_definitions().len(), 1);
assert_eq!(file.chain_extensions().len(), 1);
assert_eq!(file.storage_items().len(), 2);
assert_eq!(file.tests().len(), 2);
}
}