Сравните два файла исходного кода, используя модели EMF
В моем приложении я должен сравнить два файла исходного кода, чтобы увидеть, изменилось ли что-то, а затем выделить эти изменения. Для этого я подумал об использовании ЭДС сравнения. Мое приложение является отдельным приложением и не используется как плагин или что-то подобное. Он должен работать без затмения. Поэтому я связал все необходимые библиотеки и попытался использовать сравнение EMF.
Проблема сейчас в том, что я не знаю, как построить две модели, которые я должен использовать для сравнения двух файлов исходного кода друг с другом. В следующем фрагменте кода, который я написал в качестве первого подхода, файлы исходного кода передаются в виде файлов (Test1.java и Test2.java), но на самом деле исходный код обоих файлов хранится в строке, как показывают параметры метода.
Поэтому мой вопрос заключается в том, как я могу сгенерировать две модели на основе String, содержащие исходный код Java, чтобы я мог использовать эти две модели для сравнения друг с другом?
public void compare(String source1, String source2) throws IOException, InterruptedException {
Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put("java", new ResourceFactoryImpl());
XSDEcoreBuilder builder = new XSDEcoreBuilder();
Collection<EObject> model1 = builder.generate(URI.createFileURI("Test1.java"));
Collection<EObject> model2 = builder.generate(URI.createFileURI("Test2.java"));
final MatchModel match = MatchService.doMatch(model1.iterator().next(), model2.iterator().next(), Collections.<String, Object> emptyMap());
final DiffModel diff = DiffService.doDiff(match, false);
final List<DiffElement> differences = new ArrayList<DiffElement>(diff.getOwnedElements());
System.out.println("MatchModel :\n");
System.out.println(ModelUtils.serialize(match));
System.out.println("DiffModel :\n");
System.out.println(ModelUtils.serialize(diff));
}
2 ответа
Я думаю, вы можете использовать метамодель Java из проекта Modisco. С его помощью вы можете десериализовать Java-файлы в модель EMF, а затем сравнить.
Проект EMFText также имеет реализацию модели Java.
Дай им попробовать!
Я думаю, что вы используете неправильную технологию здесь. AFAIK, EMF не поддерживает генератор синтаксического анализа, который можно использовать для анализа исходного кода Java и построения деревьев синтаксического анализа в качестве моделей EMF.
IMO, лучше было бы использовать один из существующих генераторов синтаксического анализатора Java (ANTLR, JavaCC и т. Д.) И существующую грамматику Java, а затем реализовать сравнение на основе деревьев синтаксического анализа, создаваемых созданным анализатором.