Groovy TypeChecking aus Java SourceJava

Java-Forum
Guest
 Groovy TypeChecking aus Java Source

Post by Guest »

Ich versuche, eine Java-Codebasis zu aktualisieren, die den von Benutzern eingegebenen Groovy-Code analysiert, um mit dem Groovy-Parrot-Parser kompatibel zu sein, und ich habe Schwierigkeiten.
Vor Parrot würden wir fangen Syntaxfehler wie dieser:

Code: Select all

@Test(expected = MultipleCompilationErrorsException.class)
public void testFailingOldWay() {
CompilerConfiguration config = new CompilerConfiguration();
config.setPluginFactory(ParserPluginFactory.antlr2());
new GroovyShell(config).parse("this is not valid");
}
Mit antlr4 / parrot wirft dieser Code tatsächlich keine Analysefehler. Zuerst dachte ich, das sei ein Fehler, aber jetzt verstehe ich, dass es möglich ist, dynamische Methoden und Variablen zu übergeben, die irgendwie gültig sein könnten

Code: Select all

@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");
}
Ich habe eine Liste von Variablen, die den bereitgestellten Skripten zur Verfügung stehen sollen, also dachte ich, ich würde so etwas tun:

Code: Select all

@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");
}
Das funktioniert, aber ich kann es nicht anweisen, bestimmte Variablen undefiniert zu lassen.
Ich habe die Dokumente gelesen und mir diesen Stapelüberlauf-Beitrag angesehen:
Embedded Groovy: Wie verwende ich die statische Typprüfung mit externen Variablen?
aber die Dokumente scheinen mir nur halbwegs für den Java-Teil zu helfen, und in dem Beitrag geht es nur darum, es in Groovy zu machen, was ich bin nicht.
In Java scheint der Erweiterungsparameter nicht zu existieren.
Ich denke, dass ich eine benutzerdefinierte Annotation und eine benutzerdefinierte Typprüfungserweiterung erstellen muss, aber das ist der Fall Ich bin mir nicht genau sicher.
Mein Plan war folgender:

Code: Select all

import org.codehaus.groovy.transform.GroovyASTTransformationClass;

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

Code: Select all

public class AllowUnresolvedVariables
extends AbstractTypeCheckingExtension
{

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

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

}
Aber ich erhalte einen Nullzeiger, der versucht, sie in meinem Konfigurationssetup zu referenzieren.
Ich habe ein einfaches Projekt auf Github erstellt, um die Probleme zu zeigen, die ich habe:
https ://github.com/karlhenselin/testGroovy
Ich freue mich über jede Hilfe, die Sie leisten können.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post