Skip to content

Commit 1dfb3d5

Browse files
Swatinemmstange
authored andcommitted
fix: Support ?Q…@ productions
I *think* this is when you use a concrete class as an explicit interface, similar to what `<Type as Trait>` is in Rust, though not quite sure.
1 parent f406647 commit 1dfb3d5

File tree

2 files changed

+26
-0
lines changed

2 files changed

+26
-0
lines changed

src/lib.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,7 @@ pub enum VarStorageKind {
257257
pub enum Name<'a> {
258258
Operator(Operator<'a>),
259259
NonTemplate(&'a [u8]),
260+
AsInterface(&'a [u8]),
260261
Template(Box<Name<'a>>, Params<'a>),
261262
Discriminator(i32),
262263
ParsedName(Box<ParseResult<'a>>),
@@ -271,6 +272,10 @@ impl<'a> fmt::Debug for Name<'a> {
271272
.debug_tuple("NonTemplate")
272273
.field(&String::from_utf8_lossy(s))
273274
.finish(),
275+
Name::AsInterface(s) => f
276+
.debug_tuple("AsInterface")
277+
.field(&String::from_utf8_lossy(s))
278+
.finish(),
274279
Name::Template(ref name, ref params) => {
275280
f.debug_tuple("Template").field(name).field(params).finish()
276281
}
@@ -875,6 +880,12 @@ impl<'a> ParserState<'a> {
875880
self.memorize_name(&name);
876881
}
877882
name
883+
} else if self.consume(b"Q") {
884+
let name = self.read_string()?;
885+
self.expect(b"@")?;
886+
let name = Name::AsInterface(name);
887+
self.memorize_name(&name);
888+
name
878889
} else {
879890
let discriminator = self.read_number()?;
880891
Name::Discriminator(discriminator)
@@ -2176,6 +2187,11 @@ impl<'a> Serializer<'a> {
21762187
Name::NonTemplate(ref name) => {
21772188
self.w.write_all(name)?;
21782189
}
2190+
Name::AsInterface(ref name) => {
2191+
write!(self.w, "[")?;
2192+
self.w.write_all(name)?;
2193+
write!(self.w, "]")?;
2194+
}
21792195
Name::Template(ref name, ref params) => {
21802196
self.write_one_name(name)?;
21812197
self.write_tmpl_params(&params)?;
@@ -2273,6 +2289,11 @@ impl<'a> Serializer<'a> {
22732289
Name::NonTemplate(ref name) => {
22742290
self.w.write_all(name)?;
22752291
}
2292+
Name::AsInterface(ref name) => {
2293+
write!(self.w, "[")?;
2294+
self.w.write_all(name)?;
2295+
write!(self.w, "]")?;
2296+
}
22762297
Name::Template(ref name, ref params) => {
22772298
self.write_one_name(name)?;
22782299
self.write_tmpl_params(&params)?;

tests/test_basics.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,11 @@ fn other_tests() {
181181
"?getFactory@SkImageShader@@UBEP6A?AV?$sk_sp@VSkFlattenable@@@@AAVSkReadBuffer@@@ZXZ",
182182
"public: virtual class sk_sp<class SkFlattenable> (__cdecl * __thiscall SkImageShader::getFactory(void) const)(class SkReadBuffer &)"
183183
);
184+
185+
expect(
186+
"?Present1@?QIDXGISwapChain4@@CDXGISwapChain@@UAGJIIPBUDXGI_PRESENT_PARAMETERS@@@Z",
187+
"public: virtual long __stdcall CDXGISwapChain::[IDXGISwapChain4]::Present1(unsigned int,unsigned int,struct DXGI_PRESENT_PARAMETERS const *)"
188+
);
184189
}
185190

186191
#[test]

0 commit comments

Comments
 (0)