2016-04-13 4 views
1

Ben verbatimText veya verbatimText, strings[], values[]programlı GStringExpression

GStringExpression

benim metin GStringExpression için temsil edilmeli Nasıl sahip

"Exception: $all" 

Onun yapıcı Ya bu metin satırını temsil edecek GStringExpression oluşturmak istiyor oluşturmak?

örneğin bu kod "Exception:" içinde

new GStringExpression("Exception:", [], [ new ConstantExpression("all") ]) 

sonuç için. Ben dolayı benim catchStatement uygulanması iken Oluşturulan kod şuna benzer çünkü verbatim kullanıyor görünüyor all

,

enter image description here

eksik bunu derlemek alamıyorum $allverbatimText içine kullanmaya çalıştığınızda gibi görünüyor

Parameter parameter = 
     new Parameter(ClassHelper.make(Exception.class), "all") 
    ExpressionStatement returnStatement = new ExpressionStatement (
     new MethodCallExpression(
      new VariableExpression("this"), 
      new ConstantExpression("println"), 
      new ArgumentListExpression([ 
       new GStringExpression(null, 
        [ 
         new ConstantExpression("Exception:") 
        ], 
        [ new VariableExpression("all") ] 
       ) 
      ]) 
     ) 
    ) 
    new CatchStatement(parameter, returnStatement) 

cevap

1

verbatimText cod içinde kullanılmaz e GStringExpression'dan üretilmiştir. Sadece hata mesajlarına sahip olmak ya da bir AST'yi “güzel bir şekilde dökmek” için burada.

strings ve values parametreleri, GStringImpl yapıcısının parametreleriyle tam olarak aynıdır. Oluşturulan kod sadece bu özellikleri yığına aktarır ve kurucuyu çağırır.

Bir GString'i kolayca bir GStringExpression'a dönüştürebilirsiniz. Groovy'de, bu ayrıştırma, bir betik bağlamında (sadece bir GString değil) antlr çözümleyici ile yapılır. GString almak ve GroovyExpression oluşturmak için hiçbir yöntem yoktur.

Sizin durumunuzda, eğer oluşturmak istediğiniz GString "merhaba $ {name}" ise, "merhaba" değeriyle ConstantExpression dizgisi ve değer parametreleri olarak dizeleri parametre olarak geçirmeniz gerekir. VariableExpression veya FieldExpression ile bir dizi.

Yapmak istediğiniz şey yalnızca bir GString'i ayrıştırmaksa (ve bir AST dönüşümü yaratmıyorsanız), muhtemelen bir TemplateEngine kullanmalısınız.

+0

Gerçekten de dönüşüm yaratmaya çalışıyorum (aslında oluşturdum ama eksik olan tek şey "gstring" içinde doğru mesajdır) – lapots

+0

Güncellenen soru – lapots

+0

Afaik, 'verbatim' sadece AST'yi dökmek için kullanılır, ne zaman groovy üretirse baytkodu. Bu yönteme bakın: https://github.com/apache/groovy/blob/master/src/main/org/codehaus/groovy/classgen/AsmClassGenerator.java#L1808 –