Действительно ли возможно отделить код, индексирующий возможности Eclipse?

В придачу вот функция PHP в WordPress, которая делает это... Я думал бы, что WordPress является одной из более популярных платформ, которая использует необычные ссылки.

    function sanitize_title_with_dashes($title) {
            $title = strip_tags($title);
            // Preserve escaped octets.
            $title = preg_replace('|%([a-fA-F0-9][a-fA-F0-9])|', '---$1---', $title);
            // Remove percent signs that are not part of an octet.
            $title = str_replace('%', '', $title);
            // Restore octets.
            $title = preg_replace('|---([a-fA-F0-9][a-fA-F0-9])---|', '%$1', $title);
            $title = remove_accents($title);
            if (seems_utf8($title)) {
                    if (function_exists('mb_strtolower')) {
                            $title = mb_strtolower($title, 'UTF-8');
                    }
                    $title = utf8_uri_encode($title, 200);
            }
            $title = strtolower($title);
            $title = preg_replace('/&.+?;/', '', $title); // kill entities
            $title = preg_replace('/[^%a-z0-9 _-]/', '', $title);
            $title = preg_replace('/\s+/', '-', $title);
            $title = preg_replace('|-+|', '-', $title);
            $title = trim($title, '-');
            return $title;
    }

Эта функция, а также некоторые функции поддержки может быть найдена в wp-includes/formatting.php.

5
задан Grundlefleck 5 November 2009 в 18:09
поделиться

9 ответов

Я бы выбрал решение, основанное на ASM , оно выполнит тяжелую работу, разрешая иерархию. Вот простой анализатор, который распечатывает иерархию вызовов данного класса:

public class Analyzer {
    public static void main(String[] args) throws IOException {
        ClassReader classReader;
        ClassNode classNode;
        String fullyQualifiedClassName = args[0];
        String callHierarchy = "";
        while (null != fullyQualifiedClassName) {
            callHierarchy = " > " + fullyQualifiedClassName + callHierarchy;
            classReader = new ClassReader(fullyQualifiedClassName);
            classNode = new ClassNode();
            classReader.accept(classNode, 0);
            if (null != classNode.superName) {
                fullyQualifiedClassName = classNode.superName.replace('/', '.');
            } else {
                fullyQualifiedClassName = null;
            }
        }
        System.out.println(callHierarchy);
    }
}

Учитывая java.util.TreeMap в качестве аргумента, он печатает

> java.lang.Object > java.util.AbstractMap > java.util.TreeMap

Я знаю, что это анализ байт-кода, но, честно говоря, ASM молниеносно быстр, и если все, что вам нужно, это иерархия вызовов, сканирование не займет много времени (я ничего не заметила).

Надеюсь на эту помощь :)

1
ответ дан 14 December 2019 в 01:10
поделиться

Вы смотрели ecj? Это компиляторная часть eclipse, выделенная в отдельный проект.

Или вы можете использовать JDT-часть eclipse: http://www.eclipse.org/jdt/core/index.php

0
ответ дан 14 December 2019 в 01:10
поделиться

Плагины Eclipse действительно не такие уж и сложные; к ним нужно немного привыкнуть, но не слишком долго.

Подумайте о добавлении любых функций, которые вы хотите, в eclipse IDE. Вы можете использовать другие функции плагина (например, JDT, который включает в себя функции поиска, которые вы ищете).

Затем вы можете предоставить свои плагины для использования всем пользователям eclipse, а не разрабатывать другой отдельный инструмент.

0
ответ дан 14 December 2019 в 01:10
поделиться

Операция, которую вы ищете, не совсем индексация. Индексирование выполняется для обеспечения полнотекстового поиска. Поиск суперкласса данного класса вряд ли можно назвать текстовым поиском.

Вы хотите написать плагин Eclipse (довольно простой, может быть всего несколько классов), который использует JDT. Вам нужно будет написать посетителя AST (абстрактное синтаксическое дерево), которое будет использоваться для анализа вашего кода. После этого вы сможете определять типы и легко перемещаться по иерархии классов с помощью средств JDT.

Посмотрите мой ответ на этот вопрос .

1
ответ дан 14 December 2019 в 01:10
поделиться

Обход байтового кода совсем несложный и не медленный. Мы провели статический анализ больших проектов кода Java в интерактивном режиме. Поскольку у вас мало времени, я бы посоветовал вам изменить что-то вроде плагина просмотра графа вызовов [1] в eclipse. Кроме того, код Eclipse трудно понять, вам лучше написать свой собственный плагин, который использует как можно больше недокументированных API Eclipse.

[1] http://www.eclipseplugincentral.com/Web_Links-index-req-viewlink-cid -1326.html

4
ответ дан 14 December 2019 в 01:10
поделиться

Взгляните на фреймворк IBM WALA . Помимо прочего, вы можете сгенерировать граф вызовов (CG) для своей базы кода. Фактически, почти все в WALA начинается с создания компьютерной графики. Вы можете изменить их примеры и заменить тестовые данные своими.

1
ответ дан 14 December 2019 в 01:10
поделиться

Я бы полностью проигнорировал Eclipse: он просто отвлечет вас.

Если вы выполняете статический анализ, вы почти наверняка захотите анализировать байт-код. Чтобы найти иерархию вызовов, вы ищите invokeinstance , invokestatic и invokes special байт-коды (см. JVM spec ). Они ссылаются на полное имя класса / метода, и вы можете построить свою иерархию вызовов, используя Map > , где FuncRef - это класс, который вы определяете для хранения информация о вызове метода.

BCEL может помочь вам со сканированием байт-кода.

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

1
ответ дан 14 December 2019 в 01:10
поделиться

Это подключаемый модуль с графическим интерфейсом пользователя для Eclipse, который дает визуальное представление иерархии вызовов. Это не список, но помощь.

http://www.certiv.net/projects/callgraph.html

1
ответ дан 14 December 2019 в 01:10
поделиться

Я подозреваю, что вы обнаружите, что проще написать плагин - для которого Eclipse разработан и документирован - чем извлекать те части, которые предназначены для внутреннего использования, и создавать из них что-то другое.

0
ответ дан 14 December 2019 в 01:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: