Импорт модели кода для класса со встроенным перечислением

Я работаю над созданием некоторых классов Java с использованием CodeModel, и у меня возникают проблемы с добавлением операторов импорта для классов, которые имеют встроенный статический Enum

Например, если у меня есть класс и создать переменную экземпляра...

Class<?> clazz = getPackageClass();
cls.field(JMod.PRIVATE, codeModel._ref(sourceClass), "testUnderlying");

Но это создает код, как...

import com.test.platform.xxx.UnderlyingType;
....
private UnderlyingType testUnderlying;

Однако, если у UnderlyingType есть поле enum, для которого я хочу вызвать статический метод (например, valueOf)...

private UnderlyingType.EnumType enum;
...
...
UnderlyingType.EnumType.valueOf(xxx);

это, кажется, сбивает с толку CodeModel и вместо того, чтобы иметь отдельный импорт и переменную экземпляра я получу

private com.test.platform.xxx.UnderlyingType testUnderlying;

Можно ли вызвать статический метод без потери импорта?

Спасибо за вашу помощь!

1 ответ

В коде JCodeModel есть комментарий, в котором упоминается, почему они не импортируют внутренние классы:

    /**
     * Returns true if the symbol represented by the short name
     * is "importable".
     */
    public boolean collisions(JDefinedClass enclosingClass) {
        // special case where a generated type collides with a type in package java
        ...
        if(c.outer()!=null)
            return true; // avoid importing inner class to work around 6431987. Also see jaxb issue 166
        }
    ...
    }

Не уверен, что ссылается на 6431987 (возможно, на внутренний SUN bug tracker), но здесь упоминается проблема jaxb:

https://java.net/jira/si/jira.issueviews:issue-html/JAXB-166/JAXB-166.html

Кажется, у них были проблемы с импортом из внутренних классов, сталкивающихся.

Стоит отметить, что этот форк JCodeModel решает эту проблему: https://github.com/UnquietCode/JCodeModel

Другие вопросы по тегам