Кастомный GroovyDocTool ничего не нашел

У меня проблемы с использованием GroovyDocTool.

Независимо от того, какие пути я прохожу в этом, мой rootDoc не разрешает какие-либо пакеты, классы или методы. Я должен предположить, что я просто иду по неправильным путям, но по жизни я не могу понять, что пройти.

class TestGroovyDoclet extends GroovyDocTool{
    public TestGroovyDoclet() {
        super([
            '~/ ... /src/'
            ,'/home/ ... /src/ ... /Sample/'
            ,'/home/ ... /src/ ... /Sample/Results.groovy'
        ]);
    }
    public void Execute(){
        System.out.println('Begin Processing Javadoc');
        System.out.format(' p %d\n', rootDoc.specifiedPackages().length);
        System.out.format(' c %d\n', rootDoc.classes().length);
        System.out.println('Finished Processing Javadoc');
    }
    public static void main(String[] args){
        (new TestGroovyDoclet()).with{
            it.Execute();
        }
    }
}

Какие параметры считаются действительными для передачи в GroovyRootDocBuilder?

1 ответ

Решение

Авторы GroovyDoc, похоже, намеревались использовать его из Ant. Это означает, что нет средств для поиска файлов, которые нужно обработать, поскольку вы уже должны знать, какие файлы вы обрабатываете. Потребитель должен указать отдельные файлы для обработки и вызвать buildPath на самом деле обрабатывать файлы. (см. переопределение buildPath)

Для тех, кто только хочет взаимодействовать с деревом документов, GroovyDocTool на самом деле не имеет значения, и пользователи, вероятно, будут лучше расширять GroovyRootDocBuilder который на самом деле содержит мясо обработки. Если вы делаете это, вы можете переписать конструктор, чтобы скрыть GroovyDocTool в целом. (см. новый конструктор)

class TestGroovyDoclet extends GroovyRootDocBuilder{
    protected def sourcepaths = [];
    public TestGroovyDoclet() {
        //HARDCODE: some test values for my testing
        this([
            '~/ ... /src/'
            ,'/home/ ... /src/ ... /Sample/'
            ,'/home/ ... /src/ ... /Sample/Results.groovy'
        ]);
    }
    public TestGroovyDoclet(String[] sourcepaths) {
        //hide the unused GroovyDocTool
        super(new GroovyDocTool(), sourcepaths, new ArrayList<LinkArgument>(), new Properties());
        this.sourcepaths = sourcepaths;
    }
    /**
     * Builds the tree by recursively searching for files
     * <p>
     * It is likely useful to override the original buildTree 
     * method as well to put some safeties in place. The parsing 
     * routines do not do a lot of validation. For those of us 
     * inheritting, it would be a good idea to override build 
     * tree ot sanitize the input list as much as possible.
     * </p>
     */
    @Override
    public void buildTree(){
        def list = [];
        // loop through the sourcepaths to recursively find the files
        for (String sourcepath : sourcepaths) {
            def root = new File(sourcepath);
            if(root.exists()){
                if(root.isFile()){
                    list << root.absolutePath;
                }
                else{
                    root.eachFileRecurse (FileType.FILES) { file -> list << file.absolutePath; };
                }
            }
        }
        buildTree(list);
    }
    /**
     * Method to actually do the processing. Sample only, does not demonstrate anything useful.
     */
    public void Execute(){
        buildTree();
        System.out.println('Begin Processing GroovyDoc');
        System.out.format(' p %d\n', rootDoc.specifiedPackages().length);
        //System.out.format(' c %d\n', rootDoc.classes().length);
        int count = 0;
        for(def p : rootDoc.specifiedPackages()){
            count += p.allClasses().length;
        }
        System.out.format(' c %d\n', count);

        System.out.println('Finished Processing GroovyDoc');
    }

    public static void main(String[] args){
        (new TestGroovyDoclet()).with{
            it.Execute();
        }
    }
}

Приведенный выше код не идеален, и не совсем то, что я придумал; скорее код предназначен для выделения некоторых ошибочных допущений, содержащихся в ФП, и механизмов для их обхода. Компиляция не гарантируется, так как он просто вырезает / вставляет элементы большей перезаписи.

Weirdness:

  1. что интересно GroovyRootDoc.classes всегда возвращается null (не знаю почему). Необходимо было перебрать каждый пакет и проверить классы, которые являются подмножеством каждого. Это было удивительно, но все равно желаемое использование.
  2. Приведенный выше код работает только на Groovy файлы, а не Java. Я думаю, что GroovyDoc задохнулся от некоторого синтаксиса java1.8 (но я не уверен).
Другие вопросы по тегам