[foreign-jextract] Using many headers splits generated code in package-private classes
Maurizio Cimadamore
maurizio.cimadamore at oracle.com
Mon Dec 14 14:22:03 UTC 2020
Had a chat with Anna from jetbrains - it seems the problem has to do
with supertypes with $ in their names - which are currently ignored by
the IDE.
While we could wait for a fix, perhaps changing the name of these
artifacts (which, at the end of they day are not exposed to users) might
be better in the long term.
Maurizio
On 11/12/2020 21:34, Maurizio Cimadamore wrote:
> For the records I already contacted JetBrains on a related issue,
> caused by this fix:
>
> https://youtrack.jetbrains.com/issue/IDEA-247596
>
> In that case the problem even appeared with source completion -
> basically skipping all symbols inside the classes with $ in their
> names. Their fix basically filtered the autocompletion output so that
> these classes were skipped (considered as internal).
>
> It is possible that by fixing that issue (which I no longer see on
> 2020.3) some other regression kicked in.
>
> Maurizio
>
> On 11/12/2020 18:56, Paul Sandoz wrote:
>> I too have had problems with IntelliJ, not recognizing methods or
>> autocompleting. I suspect we need to file a bug as the code
>> arrangement is a little unusual.
>>
>> Paul.
>>
>>> On Dec 11, 2020, at 10:39 AM, Filip Krakowski
>>> <filip.krakowski at hhu.de> wrote:
>>>
>>> Hi,
>>>
>>> sorry for all the mails. Turns out IntelliJ's autocompletion let me
>>> think the method was only accessible through "ucx_h$0". Importing it
>>> using "import static org.openucx.ucx_h.copysign;" works just fine.
>>> Switching to class mode again yields "Cannot resolve symbol
>>> 'copysign'". I think I will stick with source mode until IntelliJ is
>>> able to handle the generated class files.
>>>
>>> Best regards
>>> Filip
>>>
>>> On 11.12.20 19:30, Filip Krakowski wrote:
>>>> Hi,
>>>>
>>>> just tried it out using source mode. Here I also get source files
>>>> with numbered suffixes (e.g "ucx_h$1.java", "ucx_h$2.java") in
>>>> which the classes are declared package-private. These classes
>>>> contain public static methods which I therefore cannot access.
>>>>
>>>> /class ucx_h$0 {//
>>>> //
>>>> // /* package-private */ ucx_h$0() {}//
>>>> // public static MethodHandle copysign$MH() {//
>>>> // return ucx_h$constants$1.copysign$MH();//
>>>> // }//
>>>> // public static @C("double") double copysign (@C("double")
>>>> double __x, @C("double") double __y) {//
>>>> // try {//
>>>> // return
>>>> (double)ucx_h$constants$1.copysign$MH().invokeExact(__x, __y);//
>>>> // } catch (Throwable ex) {//
>>>> // throw new AssertionError(ex);//
>>>> // }//
>>>> // }/
>>>>
>>>>
>>>> Here "ucx_h$0" is package-private which makes the public static
>>>> method "copysign" inaccessible. Shouldn't these classes be public?
>>>>
>>>> Best regards
>>>> Filip
>>>>
>>>> On 11.12.20 18:59, Filip Krakowski wrote:
>>>>> Hi,
>>>>>
>>>>> I should add that this only happens when a method gets placed
>>>>> inside a inner class (e.g "ucx_h$1").
>>>>>
>>>>> Best regards
>>>>> Filip
>>>>>
>>>>> On 11.12.20 18:56, Filip Krakowski wrote:
>>>>>> Hi,
>>>>>>
>>>>>> In my case autocompletion doesn't work either and IntelliJ only
>>>>>> shows the message "Cannot not resolve symbol 'eventfd'" when I
>>>>>> try to import it using "import static
>>>>>> org.openucx.ucx_h.eventfd;". However, compiling and executing a
>>>>>> small class calling the function works.
>>>>>>
>>>>>> Best regards
>>>>>> Filip
>>>>>>
>>>>>> On 11.12.20 18:47, Maurizio Cimadamore wrote:
>>>>>>> The class generation mode has always had issues for me in
>>>>>>> IntelliJ. Last time I checked, Intellij did not handle the ldc
>>>>>>> opcode with dynamic constants (condy) internally, which gave
>>>>>>> issues when e.g. trying to decompile a class.
>>>>>>>
>>>>>>> That said, auto completion at least used to work.
>>>>>>>
>>>>>>> Maurizio
>>>>>>>
>>>>>>> On 11/12/2020 17:41, Filip Krakowski wrote:
>>>>>>>> Hi,
>>>>>>>>
>>>>>>>> looks like I wrote too soon and IntelliJ simply is not able to
>>>>>>>> handle the generated class files correctly. Is anyone using
>>>>>>>> IntelliJ (2020.3) and can confirm that it is not able to
>>>>>>>> resolve generated methods which are created in inner classes?
>>>>>>>> This worked for me in the past.
>>>>>>>>
>>>>>>>> Best regards
>>>>>>>> Filip
>>>>>>>>
>>>>>>>> On 11.12.20 18:30, Filip Krakowski wrote:
>>>>>>>>> Hi,
>>>>>>>>>
>>>>>>>>> I am trying to generate bindings for the ucx library
>>>>>>>>> (https://github.com/openucx/ucx). The input I pass to jextract
>>>>>>>>> is the following header file (filename = "ucx.h", package =
>>>>>>>>> "org.openucx", source mode = false).
>>>>>>>>>
>>>>>>>>> /// OpenUCX Transports//
>>>>>>>>> //#include <uct/api/uct.h>//
>>>>>>>>> //
>>>>>>>>> //// OpenUCX Protocols//
>>>>>>>>> //#include <ucp/api/ucp.h>//
>>>>>>>>> //
>>>>>>>>> //// I/O Multiplexing//
>>>>>>>>> //#include <sys/epoll.h>//
>>>>>>>>> //#include <sys/eventfd.h>//
>>>>>>>>> //
>>>>>>>>> //// File descriptor utilities//
>>>>>>>>> //#include <fcntl.h>//
>>>>>>>>> //#include <unistd.h>/
>>>>>>>>>
>>>>>>>>> It looks like a large amount of the generated code ends up in
>>>>>>>>> numbered package-private classes. As an example, I can't
>>>>>>>>> access the MethodHandle for "eventfd" because it is in a
>>>>>>>>> package-private class named "org.openucx.ucx_h$1". If I remove
>>>>>>>>> the includes for "<uct/api/uct.h>" and "<ucp/api/ucp.h>" the
>>>>>>>>> generated method is created in class "org.openucx.ucx_h" where
>>>>>>>>> I can access it./
>>>>>>>>> //
>>>>>>>>> /Is there a way to access code generated in the other
>>>>>>>>> (numbered) package-private classes I'm missing?
>>>>>>>>>
>>>>>>>>> Best regards
>>>>>>>>> Filip
More information about the panama-dev
mailing list