Skip to content

Commit 4a4bebf

Browse files
committed
feat: Describe interface classes
1 parent 241c624 commit 4a4bebf

File tree

3 files changed

+42
-5
lines changed

3 files changed

+42
-5
lines changed

src/builders/class.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,10 @@ impl ClassBuilder {
5858
}
5959
}
6060

61+
pub fn get_flags(&self) -> u32 {
62+
self.ce.ce_flags
63+
}
64+
6165
/// Sets the class builder to extend another class.
6266
///
6367
/// # Parameters

src/describe/mod.rs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use crate::builders::EnumBuilder;
77
use crate::{
88
builders::{ClassBuilder, FunctionBuilder},
99
constant::IntoConst,
10-
flags::{DataType, MethodFlags, PropertyFlags},
10+
flags::{ClassFlags, DataType, MethodFlags, PropertyFlags},
1111
prelude::ModuleBuilder,
1212
};
1313
use abi::{Option, RString, Str, Vec};
@@ -193,6 +193,8 @@ pub struct Class {
193193
pub methods: Vec<Method>,
194194
/// Constants of the class.
195195
pub constants: Vec<Constant>,
196+
/// Class flags
197+
pub flags: u32,
196198
}
197199

198200
#[cfg(feature = "closure")]
@@ -225,15 +227,18 @@ impl Class {
225227
}),
226228
r#static: false,
227229
visibility: Visibility::Public,
230+
r#abstract: false
228231
}]
229232
.into(),
230233
constants: StdVec::new().into(),
234+
flags: 0,
231235
}
232236
}
233237
}
234238

235239
impl From<ClassBuilder> for Class {
236240
fn from(val: ClassBuilder) -> Self {
241+
let flags = val.get_flags();
237242
Self {
238243
name: val.name.into(),
239244
docs: DocBlock(
@@ -269,6 +274,7 @@ impl From<ClassBuilder> for Class {
269274
.map(Constant::from)
270275
.collect::<StdVec<_>>()
271276
.into(),
277+
flags: flags
272278
}
273279
}
274280
}
@@ -416,6 +422,8 @@ pub struct Method {
416422
pub r#static: bool,
417423
/// Visibility of the method.
418424
pub visibility: Visibility,
425+
/// Not describe method body, if is abstract.
426+
pub r#abstract: bool,
419427
}
420428

421429
impl From<(FunctionBuilder<'_>, MethodFlags)> for Method {
@@ -448,6 +456,7 @@ impl From<(FunctionBuilder<'_>, MethodFlags)> for Method {
448456
ty: flags.into(),
449457
r#static: flags.contains(MethodFlags::Static),
450458
visibility: flags.into(),
459+
r#abstract: flags.contains(MethodFlags::Abstract),
451460
}
452461
}
453462
}
@@ -685,6 +694,7 @@ mod tests {
685694
retval: Option::None,
686695
r#static: false,
687696
visibility: Visibility::Protected,
697+
r#abstract: false
688698
}
689699
);
690700
}

src/describe/stub.rs

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use super::{
1616

1717
#[cfg(feature = "enum")]
1818
use crate::describe::{Enum, EnumCase};
19-
use crate::flags::DataType;
19+
use crate::flags::{ClassFlags, DataType};
2020

2121
/// Implemented on types which can be converted into PHP stubs.
2222
pub trait ToStub {
@@ -226,13 +226,20 @@ impl ToStub for Class {
226226
self.docs.fmt_stub(buf)?;
227227

228228
let (_, name) = split_namespace(self.name.as_ref());
229-
write!(buf, "class {name} ")?;
229+
let flags = ClassFlags::from_bits(self.flags).unwrap();
230+
let is_interface = flags.contains(ClassFlags::Interface);
231+
232+
if is_interface {
233+
write!(buf, "interface {name} ")?;
234+
} else {
235+
write!(buf, "class {name} ")?;
236+
}
230237

231238
if let Option::Some(extends) = &self.extends {
232239
write!(buf, "extends {extends} ")?;
233240
}
234241

235-
if !self.implements.is_empty() {
242+
if !self.implements.is_empty() && !is_interface {
236243
write!(
237244
buf,
238245
"implements {} ",
@@ -244,6 +251,18 @@ impl ToStub for Class {
244251
)?;
245252
}
246253

254+
if !self.implements.is_empty() && is_interface {
255+
write!(
256+
buf,
257+
"extends {} ",
258+
self.implements
259+
.iter()
260+
.map(RString::as_str)
261+
.collect::<StdVec<_>>()
262+
.join(", ")
263+
)?;
264+
}
265+
247266
writeln!(buf, "{{")?;
248267

249268
buf.push_str(
@@ -360,7 +379,11 @@ impl ToStub for Method {
360379
}
361380
}
362381

363-
writeln!(buf, " {{}}")
382+
if !self.r#abstract {
383+
writeln!(buf, " {{}}")
384+
} else {
385+
writeln!(buf, ";")
386+
}
364387
}
365388
}
366389

0 commit comments

Comments
 (0)