CsWinRT icon indicating copy to clipboard operation
CsWinRT copied to clipboard

Bug: "Could not find property getter interface" error

Open PDeets opened this issue 8 months ago • 0 comments

Description

I'm using C#/WinRT on a type where the IDL looks something like this:

    interface IDataSource : IInspectable
    {
        [propget] HRESULT MyProperty([out, retval] IItem** value);
    }
 
    interface IDataSink : IInspectable
    {
        [propput] HRESULT MyProperty([in] IItem* value);
    }
 
    runtimeclass DataSource
    {
        [default] interface IDataSink;
        interface IDataSource;
    }

(I've shared the exact code with the C#/WinRT team in private, but I'm not putting it here due to it being internal Microsoft code.)

I'm getting an error like this: error: 'Could not find property getter interface' when processing MyNamespace.IDataSink

When cswinrt.exe sees IDataSink, it notices there is a setter without a getter, so it calls find_property_interface to find the interface that the getter is implemented on.

        auto [getter, setter] = get_property_methods(prop);
        // "new" required if overriding a getter in a base interface
        auto new_keyword = (!getter && setter && find_property_interface(w, type, prop.Name()).second) ? "new " : "";

However, in find_property_interface, it doesn’t find the getter interface for this case. The InterfaceImpl method returns an empty collection for the setter interface and the get_attribute block is not entered, so find_property_interface reaches its throw statement.

Steps To Reproduce

Use the pattern I shared above and try to generate interop code using cswinrt.exe. I have shared the winmds and a repro command line with the C#/WinRT devs through email.

Expected Behavior

cswinrt.exe should successfully generate interop code for this runtime class and its interfaces.

Version Info

This reproduces with the latest version of C#/WinRT. I tested with 2.1.1 and a newer version as well.

Additional Context

No response

PDeets avatar Mar 01 '25 05:03 PDeets