Groovy TypeChecking из исходного кода JavaJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Groovy TypeChecking из исходного кода Java

Сообщение Anonymous »

Я пытаюсь обновить базу кода Java, которая анализирует groovy-код, предоставленный пользователями, чтобы обеспечить его совместимость с анализатором попугаев Groovy, и у меня возникают трудности.
Перед попугаем мы бы поймали синтаксические ошибки, подобные этой:

Код: Выделить всё

@Test(expected = MultipleCompilationErrorsException.class)
public void testFailingOldWay() {
CompilerConfiguration config = new CompilerConfiguration();
config.setPluginFactory(ParserPluginFactory.antlr2());
new GroovyShell(config).parse("this is not valid");
}
с antlr4 / parrot этот код фактически не выдает никаких ошибок синтаксического анализа. Сначала я подумал, что это ошибка, но теперь я понимаю, что можно передавать динамические методы и переменные, которые каким-то образом могут быть действительными

Код: Выделить всё

@Test
public void testFailingNewWayDoesNotWork() {
CompilerConfiguration config = new CompilerConfiguration();
// Expect the next line to throw a compilation error, but it doesn't.
new GroovyShell(config).parse("this is not valid");
}
У меня есть список переменных, которые должны быть доступны предоставленным сценариям, поэтому я решил сделать что-то вроде:

Код: Выделить всё

@Test(expected = MultipleCompilationErrorsException.class)
public void testNewIdea() {
CompilerConfiguration config = new CompilerConfiguration();
config.addCompilationCustomizers(new ASTTransformationCustomizer(TypeChecked.class));
new GroovyShell(config).parse("this is not valid");
}
Это работает, но я не могу найти способ указать, чтобы некоторые переменные были неопределенными.
Я прочитал документацию и посмотрел на этот пост о переполнении стека:
Встроенный Groovy: как использовать статическую проверку типов с внешними переменными?
но документация, кажется, дает мне только половину пути к Java-части, и весь пост посвящен тому, как сделать это в groovy, что я и делаю нет.
В Java параметр расширений, похоже, не существует.
Я думаю, что мне нужно создать собственную аннотацию и собственное расширение проверки типов, но я не уверен точно.
Мой план был такой:

Код: Выделить всё

import org.codehaus.groovy.transform.GroovyASTTransformationClass;

@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@GroovyASTTransformationClass("flexagon.fd.model.script.AllowUnresolvedVariables")
public @interface NoUnresolvedVariablesAnnotation
{
}
и

Код: Выделить всё

public class AllowUnresolvedVariables
extends AbstractTypeCheckingExtension
{

public AllowUnresolvedVariables(final StaticTypeCheckingVisitor typeCheckingVisitor)
{
super(typeCheckingVisitor);
}

@Override
public boolean handleUnresolvedVariableExpression(final VariableExpression vexp)
{
return true;
}

}
Но я получаю нулевой указатель, пытаясь сослаться на них в моей настройке конфигурации.
Я создал простой проект на github, чтобы показать проблемы, с которыми я сталкиваюсь:
https ://github.com/karlhenselin/testGroovy
Я ценю любую вашу помощь.

Подробнее здесь: https://stackoverflow.com/questions/793 ... ava-source
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»