package com.github.javaparser.ast.plugin; import com.github.javaparser.JavaParser; import com.github.javaparser.ParseException; import com.github.javaparser.ast.Node; import com.github.javaparser.ast.expr.AnnotationExpr; import com.github.javaparser.ast.expr.MemberValuePair; import com.github.javaparser.ast.expr.SingleMemberAnnotationExpr; import com.github.javaparser.ast.expr.TemplateLiteralExpr; import com.github.javaparser.ast.expr.UiExpr; import com.github.javaparser.ast.visitor.TransformVisitor; import xapi.fu.Printable; /** * @author James X. Nelson (james@wetheinter.net) * Created on 4/11/16. */ public class UiTransformer extends Transformer { private UiTranslatorPlugin plugin; private Transformer delegate; @Override public String onTemplateStart( Printable printer, TemplateLiteralExpr template ) { if (shouldConvertToString(template)) { TransformVisitor.normalizeToString(printer, template.getValueWithoutTicks()); return DO_NOT_PRINT; } if (plugin == null) { if (delegate != null) { return delegate.onTemplateStart(printer, template); } return super.onTemplateStart(printer, template); } final UiExpr ui; try { // For now, only supporting "html" roots ui = JavaParser.parseUiContainer(template.getValueWithoutTicks()); } catch (ParseException e) { throw new RuntimeException(e); } return plugin.transformUi(printer, ui); } protected boolean shouldConvertToString(TemplateLiteralExpr template) { final Node parent = template.getParentNode(); if (parent instanceof SingleMemberAnnotationExpr || ( parent instanceof MemberValuePair && parent.getParentNode() instanceof AnnotationExpr)) { // Template strings in annotations we will just turn into escaped java strings. // If there is a desire to make this behavior pluggable, // this method has been left protected to aid you in your journey. return true; } return false; } public Transformer getDelegate() { return delegate; } public void setDelegate(Transformer delegate) { this.delegate = delegate; } public UiTranslatorPlugin getPlugin() { return plugin; } public void setPlugin(UiTranslatorPlugin plugin) { this.plugin = plugin; } }