docs: @Override
      public GStringExpression visitGstring(GstringContext ctx) {
          final List<ConstantExpression> stringLiteralList = new LinkedList<>();
          final String begin = ctx.GStringBegin().getText();
          final String beginQuotation = beginQuotation(begin);
          stringLiteralList.add(configureAST(new ConstantExpression(parseGStringBegin(ctx, beginQuotation)), ctx.GStringBegin()));
  
          List<ConstantExpression> partStrings =
                  ctx.GStringPart().stream()
                          .map(e -> configureAST(new ConstantExpression(parseGStringPart(e, beginQuotation)), e))
                          .collect(Collectors.toList());
          stringLiteralList.addAll(partStrings);
  
          stringLiteralList.add(configureAST(new ConstantExpression(parseGStringEnd(ctx, beginQuotation)), ctx.GStringEnd()));
  
          List<Expression> values = ctx.gstringValue().stream()
                  .map(e -> {
                      Expression expression = this.visitGstringValue(e);
  
                      if (expression instanceof ClosureExpression && !hasArrow(e)) {
                          List<Statement> statementList = ((BlockStatement) ((ClosureExpression) expression).getCode()).getStatements();
  
                          if (statementList.stream().noneMatch(DefaultGroovyMethods::asBoolean)) {
                              return configureAST(new ConstantExpression(null), e);
                          }
  
                          return configureAST(this.createCallMethodCallExpression(expression, new ArgumentListExpression(), true), e);
                      }
  
                      return expression;
                  })
                  .collect(Collectors.toList());
  
          StringBuilder verbatimText = new StringBuilder(ctx.getText().length());
          for (int i = 0, n = stringLiteralList.size(), s = values.size(); i < n; i++) {
              verbatimText.append(stringLiteralList.get(i).getValue());
  
              if (i == s) {
                  continue;
              }
  
              Expression value = values.get(i);
              if (!asBoolean(value)) {
                  continue;
              }
  
              verbatimText.append(DOLLAR_STR);
              verbatimText.append(value.getText());
          }
  
          return configureAST(new GStringExpression(verbatimText.toString(), stringLiteralList, values), ctx);
      }