/*
* Copyright 2016 Google Inc. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.errorprone.fixes;
import com.google.common.collect.ImmutableList;
/**
* Helper class for accumulating a branching tree of alternative fixes designed to help build as set
* of potential fixes with different options in them.
*
* <p>Consider building a list of fixes from a set of operations A followed by B or C then D or E.
* The resulting list should be ABD, ACD, ABE, ACE.
*
* <pre>{@code
* BranchedSuggestedFixes a = BranchedSuggestedFixes.builder()
* .startWith(A)
* .then()
* .addOption(B)
* .addOption(C)
* .then()
* .addOption(D)
* .addOption(E)
* .build();
* }</pre>
*
* This class assumes that in order to build a valid set of fixes you must make some progress at
* each branch. So two calls to branch with no merges in between will result in an empty list of
* fixes at the end.
*
* @author andrewrice@google.com (Andrew Rice)
*/
public class BranchedSuggestedFixes {
private final ImmutableList<SuggestedFix> fixes;
private BranchedSuggestedFixes(ImmutableList<SuggestedFix> fixes) {
this.fixes = fixes;
}
public ImmutableList<SuggestedFix> getFixes() {
return fixes;
}
public static Builder builder() {
return new Builder();
}
/** Builder class for BranchedSuggestedFixes */
public static class Builder {
private ImmutableList.Builder<SuggestedFix> builder = ImmutableList.builder();
private ImmutableList<SuggestedFix> savedList = ImmutableList.of();
public Builder startWith(SuggestedFix fix) {
savedList = ImmutableList.of();
builder = ImmutableList.<SuggestedFix>builder().add(fix);
return this;
}
public Builder addOption(SuggestedFix fix) {
if (!savedList.isEmpty()) {
for (SuggestedFix s : savedList) {
builder.add(SuggestedFix.builder().merge(s).merge(fix).build());
}
}
return this;
}
public Builder then() {
savedList = builder.build();
builder = ImmutableList.builder();
return this;
}
public BranchedSuggestedFixes build() {
return new BranchedSuggestedFixes(builder.build());
}
}
}