// Path: src/main/java/com/github/opaluchlukasz/junit2spock/core/Applicable.java
// public enum Applicable {
//     TEST_METHOD, FIXTURE_METHOD, REGULAR_METHOD, FIELD_FEATURE;
// 
//     @Component
//     static class ApplicableInjector {
//         @Autowired private FeatureProvider featureProvider;
// 
//         @PostConstruct
//         public void init() {
//             stream(Applicable.values()).forEach(applicable -> applicable.featureProvider = featureProvider);
//         }
//     }
// 
//     private FeatureProvider featureProvider;
// 
//     public void applyFeaturesToStatements(List<Object> statements) {
//         List<Feature> features = features();
//         for (int i = 0; i < statements.size(); i++) {
//             Object bodyNode = statements.get(i);
//             statements.remove(i);
//             for (Feature testMethodFeature : features) {
//                 bodyNode = testMethodFeature.apply(bodyNode);
//             }
//             statements.add(i, bodyNode);
//         }
//     }
// 
//     public List<Feature> features() {
//         return featureProvider.features(this);
//     }
// }
// 
// Path: src/main/java/com/github/opaluchlukasz/junit2spock/core/groovism/Groovism.java
// public abstract class Groovism implements UnaryOperator<String> {
// 
//     private final Optional<Groovism> next;
// 
//     Groovism(Optional<Groovism> next) {
//         this.next = next;
//     }
// 
//     @Override
//     public String apply(String line) {
//         String groovierLine = applyGroovism(line);
//         return next.map(next -> next.apply(groovierLine)).orElse(groovierLine);
//     }
// 
//     protected abstract String applyGroovism(String line);
// }
// 
// Path: src/main/java/com/github/opaluchlukasz/junit2spock/core/groovism/GroovismChainProvider.java
// public static Groovism provide() {
//     return new NoSemicolon(new NoClassKeyword(new RegularString(new NoPublicKeyword())));
// }
// 
// Path: src/main/java/com/github/opaluchlukasz/junit2spock/core/util/StringUtil.java
// public static final String SEPARATOR = System.getProperty("line.separator");
// 
// Path: src/main/java/com/github/opaluchlukasz/junit2spock/core/util/StringUtil.java
// public static String indentation(int indentationInTabs) {
//     return IntStream.rangeClosed(1, indentationInTabs).mapToObj(__ -> "\t").reduce("", (a, b) ->  a + b);
// }


import com.github.opaluchlukasz.junit2spock.core.Applicable;
import com.github.opaluchlukasz.junit2spock.core.groovism.Groovism;
import java.util.function.Consumer;
import static com.github.opaluchlukasz.junit2spock.core.groovism.GroovismChainProvider.provide;
import static com.github.opaluchlukasz.junit2spock.core.util.StringUtil.SEPARATOR;
import static com.github.opaluchlukasz.junit2spock.core.util.StringUtil.indentation;
package com.github.opaluchlukasz.junit2spock.core.node.wrapper;




public class BaseWrapper {

    private final int indentationLevel;
    private final Applicable applicable;
    private final Groovism groovism;

    BaseWrapper(int indentationLevel, Applicable applicable) {
        this.indentationLevel = indentationLevel;
        this.applicable = applicable;
        this.groovism = provide();
    }

    int indentationLevel() {
        return indentationLevel;
    }

    protected Applicable applicable() {
// Path: src/main/java/com/github/opaluchlukasz/junit2spock/core/Applicable.java
// public enum Applicable {
//     TEST_METHOD, FIXTURE_METHOD, REGULAR_METHOD, FIELD_FEATURE;
// 
//     @Component
//     static class ApplicableInjector {
//         @Autowired private FeatureProvider featureProvider;
// 
//         @PostConstruct
//         public void init() {
//             stream(Applicable.values()).forEach(applicable -> applicable.featureProvider = featureProvider);
//         }
//     }
// 
//     private FeatureProvider featureProvider;
// 
//     public void applyFeaturesToStatements(List<Object> statements) {
//         List<Feature> features = features();
//         for (int i = 0; i < statements.size(); i++) {
//             Object bodyNode = statements.get(i);
//             statements.remove(i);
//             for (Feature testMethodFeature : features) {
//                 bodyNode = testMethodFeature.apply(bodyNode);
//             }
//             statements.add(i, bodyNode);
//         }
//     }
// 
//     public List<Feature> features() {
//         return featureProvider.features(this);
//     }
// }
// 
// Path: src/main/java/com/github/opaluchlukasz/junit2spock/core/groovism/Groovism.java
// public abstract class Groovism implements UnaryOperator<String> {
// 
//     private final Optional<Groovism> next;
// 
//     Groovism(Optional<Groovism> next) {
//         this.next = next;
//     }
// 
//     @Override
//     public String apply(String line) {
//         String groovierLine = applyGroovism(line);
//         return next.map(next -> next.apply(groovierLine)).orElse(groovierLine);
//     }
// 
//     protected abstract String applyGroovism(String line);
// }
// 
// Path: src/main/java/com/github/opaluchlukasz/junit2spock/core/groovism/GroovismChainProvider.java
// public static Groovism provide() {
//     return new NoSemicolon(new NoClassKeyword(new RegularString(new NoPublicKeyword())));
// }
// 
// Path: src/main/java/com/github/opaluchlukasz/junit2spock/core/util/StringUtil.java
// public static final String SEPARATOR = System.getProperty("line.separator");
// 
// Path: src/main/java/com/github/opaluchlukasz/junit2spock/core/util/StringUtil.java
// public static String indentation(int indentationInTabs) {
//     return IntStream.rangeClosed(1, indentationInTabs).mapToObj(__ -> "\t").reduce("", (a, b) ->  a + b);
// }


// Path: src/main/java/com/github/opaluchlukasz/junit2spock/core/node/wrapper/BaseWrapper.java
import com.github.opaluchlukasz.junit2spock.core.Applicable;
import com.github.opaluchlukasz.junit2spock.core.groovism.Groovism;
import java.util.function.Consumer;
import static com.github.opaluchlukasz.junit2spock.core.groovism.GroovismChainProvider.provide;
import static com.github.opaluchlukasz.junit2spock.core.util.StringUtil.SEPARATOR;
import static com.github.opaluchlukasz.junit2spock.core.util.StringUtil.indentation;

package com.github.opaluchlukasz.junit2spock.core.node.wrapper;




public class BaseWrapper {

    private final int indentationLevel;
    private final Applicable applicable;
    private final Groovism groovism;

    BaseWrapper(int indentationLevel, Applicable applicable) {
        this.indentationLevel = indentationLevel;
        this.applicable = applicable;
        this.groovism = provide();
    }

    int indentationLevel() {
        return indentationLevel;
    }

    protected Applicable applicable() {
        return applicable;