2016-05-03 12 views
0

Ich erstelle eine aktive Annotation, um einige Textbausteine ​​aus meinen Xtend-Quelldateien zu entfernen.Wie kann ich sicherstellen, dass die erforderlichen Importe in der Java-Ausgabe enthalten sind, die vom aktiven Xtend-Annotationsprozessor generiert wird?

Das folgende ist der Ausschnitt des Quellcodes meines AbstractFieldProcessor.

package dynamic 

import java.lang.annotation.ElementType 
import java.lang.annotation.Target 
import org.eclipse.xtend.lib.macro.AbstractFieldProcessor 
import org.eclipse.xtend.lib.macro.Active 
import org.eclipse.xtend.lib.macro.TransformationContext 
import org.eclipse.xtend.lib.macro.declaration.MutableFieldDeclaration 


@Target(ElementType.FIELD) 
@Active(DynamicCarmenFieldProcessor) 
annotation DynamicCarmenField 
{ 
    String xpath 
    String prefix; 
    String suffix; 
} 

class DynamicCarmenFieldProcessor extends AbstractFieldProcessor { 



    override doTransform(MutableFieldDeclaration field, extension TransformationContext context) 
    { 



     if (!field.type.toString.equals("WebElement")) 
      field.addError("Only Type WebElement is supported by @Dynamic") 

     if (field.initializer != null) 
      field.addError("Initialisers are not supported by @Dynamic ") 

     var annotations = field.getAnnotations() 

     var xpath = ""; 
     var suffix = ""; 
     var prefix = ""; 

     for(annotation:annotations) 
     { 
      if(annotation.annotationTypeDeclaration.simpleName == "DynamicCarmenField") 
      { 

       xpath = annotation.getStringValue("xpath") 
       suffix = annotation.getStringValue("suffix")  
       prefix = annotation.getStringValue("prefix")    
      }   
     } 

     val xpa = xpath 
     val suf = suffix 
     val pre = prefix 


     field.declaringType.addMethod('click' + field.simpleName.toFirstUpper) 
     [ 

      body = 
      ''' 
       WebElement webElement = driver.findElement(By.xpath("«xpa»")); 
       String dependentOnId = webElement.getAttribute("id"); 
       String «field.simpleName»Id ="«pre»"+ dependentOnId +"«suf»"; 
       «field.simpleName» = driver.findElement(By.id(«field.simpleName»Id)); 
       «field.simpleName».click(); 
      ''' 
     ] 


     field.declaringType.addMethod('set'+ field.simpleName.toFirstUpper +'Input') 
     [ 


      var stringType = context.findTypeGlobally("String") 
      addParameter("values",context.newTypeReference(stringType)) 
      body= 
      ''' 
       this.click«field.simpleName.toFirstUpper»(); 
       «field.simpleName»Input.sendKeys(values); 
      ''' 
     ] 

    } 







} 

Dieser Code ist in Ordnung. Jetzt versuche ich es im folgenden TestFile wie folgt zu benutzen bekomme ich eine Fehlermeldung. Ich habe festgestellt, dass das Problem darin liegt, dass der generierte Java-Code nicht alle Importe enthält.

package dynamic 

import org.openqa.selenium.WebDriver 
import org.openqa.selenium.WebElement 
import org.openqa.selenium.support.FindBy 


class DynamicCarmenFieldExample 
{ 
    WebDriver driver 
    @DynamicCarmenField(xpath="//table[@datatable='1' and @summary!='Question Administration']" , prefix="1", suffix="_Sequence") 
    WebElement answerSequenceField 
    @FindBy(id="1_Sequence") 
    WebElement answerSequenceFieldInput 




} 

Unten ist der generierte Java-Code.

import dynamic.DynamicCarmenField; 
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.WebElement; 
import org.openqa.selenium.support.FindBy; 

@SuppressWarnings("all") 
public class DynamicCarmenFieldExample { 
    private WebDriver driver; 

    @DynamicCarmenField(xpath = "//table[@datatable=\'1\' and @summary!=\'Question Administration\']", prefix = "1", suffix = "_Sequence") 
    private WebElement answerSequenceField; 

    @FindBy(id = "1_Sequence") 
    private WebElement answerSequenceFieldInput; 

    public void clickAnswerSequenceField() { 
    WebElement webElement = driver.findElement(By.xpath("//table[@datatable='1' and @summary!='Question Administration']")); 
    String dependentOnId = webElement.getAttribute("id"); 
    String answerSequenceFieldId ="1"+ dependentOnId +"_Sequence"; 
    answerSequenceField = driver.findElement(By.id(answerSequenceFieldId)); 
    answerSequenceField.click(); 
    } 

    public void setAnswerSequenceFieldInput(final String values) { 
    this.clickAnswerSequenceField(); 
    answerSequenceFieldInput.sendKeys(values); 
    } 
} 

Das Problem ist, dass der Code

import org.openqa.selenium.By 

aus dem erzeugten Java fehlt. Der Code erkennt nicht, dass er in die generierte Java-Datei aufgenommen werden muss. Ich weiß, dass ich das umgehen kann, indem ich das Paket und in der Xtend-Quelle importiere, aber ich möchte, dass meine aktive Anmerkung die Importe korrekt machen kann. Ist das möglich?

Antwort

1

Sie können TypeReferenceProvider.newTypeReference() in der Vorlage Ausdruck verwenden:.

WebElement webElement = driver.findElement(«By.newTypeReference».xpath("«xpa»")); 

Die anderen Typen werden automatisch importiert, da sie wahrscheinlich durch den verarbeitete Typen referenziert werden (zB aus durch das Feld, nach der Methode Rückgabetyp oder Parametertyp, etc.).


Beispiel Xtend Code:

package test 

import org.eclipse.xtend.lib.macro.Active 
import org.eclipse.xtend.lib.macro.AbstractClassProcessor 
import org.eclipse.xtend.lib.macro.declaration.MutableClassDeclaration 
import org.eclipse.xtend.lib.macro.TransformationContext 
import java.util.Date 

@Active(MyAnnotationProcessor) 
annotation MyAnnotation 
{ 
} 

class MyAnnotationProcessor extends AbstractClassProcessor 
{ 
    override doTransform(MutableClassDeclaration annotatedClass, extension TransformationContext context) 
    { 
     annotatedClass.addMethod("generatedMethod") [ 
      body = '''«Date.newTypeReference» date = new Date();''' 
     ] 
    } 
} 

Die genannten Typen werden in der generierten Java-Code eingeführt werden:

package test; 

import java.util.Date; 
import test.MyAnnotation; 

@MyAnnotation 
@SuppressWarnings("all") 
public class MyAnnotationTest { 
    public void generatedMethod() { 
    Date date = new Date(); 
    } 
} 
+0

Works. Groß. Vielen Dank – KennyBartMan