@Override
  public void applyTransformation(@NotNull TransformationContext context) {
    PsiAnnotation annotation = PsiImplUtil.getAnnotation(context.getCodeClass(), BUILDER_FQN);
    if (!isApplicable(annotation, EXTERNAL_STRATEGY_NAME)) return;

    final PsiClass constructedClass = GrAnnotationUtil.inferClassAttribute(annotation, "forClass");
    if (constructedClass == null || "groovy.transform.Undefined.CLASS".equals(constructedClass.getQualifiedName())) return;
    boolean includeSuper = isIncludeSuperProperties(annotation);
    if (constructedClass instanceof GrTypeDefinition) {
      PsiField[] fields = getFields((GrTypeDefinition)constructedClass, includeSuper, context);
      for (PsiField field : fields) {
        context.addMethod(DefaultBuilderStrategySupport.createFieldSetter(context.getCodeClass(), field, annotation, context));
      }
    } else {
      Collection<PsiMethod> properties = PropertyUtilBase.getAllProperties(constructedClass, true, false, includeSuper).values();
      for (PsiMethod setter : properties) {
        final PsiMethod builderSetter = createFieldSetter(context, setter, annotation);
        if (builderSetter != null) context.addMethod(builderSetter);
      }
    }
    context.addMethod(createBuildMethod(annotation, createType(constructedClass)));
  }
@Override
  public void applyTransformation(@NotNull TransformationContext context)