mirror of
https://github.com/encounter/msvc-demangler-rust.git
synced 2026-07-10 12:18:38 -07:00
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.
This commit is contained in:
committed by
Markus Stange
parent
f406647e57
commit
1dfb3d53cf
+21
@@ -257,6 +257,7 @@ pub enum VarStorageKind {
|
||||
pub enum Name<'a> {
|
||||
Operator(Operator<'a>),
|
||||
NonTemplate(&'a [u8]),
|
||||
AsInterface(&'a [u8]),
|
||||
Template(Box<Name<'a>>, Params<'a>),
|
||||
Discriminator(i32),
|
||||
ParsedName(Box<ParseResult<'a>>),
|
||||
@@ -271,6 +272,10 @@ impl<'a> fmt::Debug for Name<'a> {
|
||||
.debug_tuple("NonTemplate")
|
||||
.field(&String::from_utf8_lossy(s))
|
||||
.finish(),
|
||||
Name::AsInterface(s) => f
|
||||
.debug_tuple("AsInterface")
|
||||
.field(&String::from_utf8_lossy(s))
|
||||
.finish(),
|
||||
Name::Template(ref name, ref params) => {
|
||||
f.debug_tuple("Template").field(name).field(params).finish()
|
||||
}
|
||||
@@ -875,6 +880,12 @@ impl<'a> ParserState<'a> {
|
||||
self.memorize_name(&name);
|
||||
}
|
||||
name
|
||||
} else if self.consume(b"Q") {
|
||||
let name = self.read_string()?;
|
||||
self.expect(b"@")?;
|
||||
let name = Name::AsInterface(name);
|
||||
self.memorize_name(&name);
|
||||
name
|
||||
} else {
|
||||
let discriminator = self.read_number()?;
|
||||
Name::Discriminator(discriminator)
|
||||
@@ -2176,6 +2187,11 @@ impl<'a> Serializer<'a> {
|
||||
Name::NonTemplate(ref name) => {
|
||||
self.w.write_all(name)?;
|
||||
}
|
||||
Name::AsInterface(ref name) => {
|
||||
write!(self.w, "[")?;
|
||||
self.w.write_all(name)?;
|
||||
write!(self.w, "]")?;
|
||||
}
|
||||
Name::Template(ref name, ref params) => {
|
||||
self.write_one_name(name)?;
|
||||
self.write_tmpl_params(¶ms)?;
|
||||
@@ -2273,6 +2289,11 @@ impl<'a> Serializer<'a> {
|
||||
Name::NonTemplate(ref name) => {
|
||||
self.w.write_all(name)?;
|
||||
}
|
||||
Name::AsInterface(ref name) => {
|
||||
write!(self.w, "[")?;
|
||||
self.w.write_all(name)?;
|
||||
write!(self.w, "]")?;
|
||||
}
|
||||
Name::Template(ref name, ref params) => {
|
||||
self.write_one_name(name)?;
|
||||
self.write_tmpl_params(¶ms)?;
|
||||
|
||||
@@ -181,6 +181,11 @@ fn other_tests() {
|
||||
"?getFactory@SkImageShader@@UBEP6A?AV?$sk_sp@VSkFlattenable@@@@AAVSkReadBuffer@@@ZXZ",
|
||||
"public: virtual class sk_sp<class SkFlattenable> (__cdecl * __thiscall SkImageShader::getFactory(void) const)(class SkReadBuffer &)"
|
||||
);
|
||||
|
||||
expect(
|
||||
"?Present1@?QIDXGISwapChain4@@CDXGISwapChain@@UAGJIIPBUDXGI_PRESENT_PARAMETERS@@@Z",
|
||||
"public: virtual long __stdcall CDXGISwapChain::[IDXGISwapChain4]::Present1(unsigned int,unsigned int,struct DXGI_PRESENT_PARAMETERS const *)"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
||||
Reference in New Issue
Block a user