blob: cf7ab456d29a77611da9ee718c68f73e3399cc37 [file] [log] [blame]
package com.intellij.dupLocator.equivalence;
import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.List;
/**
* @author Eugene.Kudelevsky
*/
public class EquivalenceDescriptorBuilder implements EquivalenceDescriptor {
private final List<SingleChildDescriptor> mySingleChildDescriptors = new ArrayList<SingleChildDescriptor>();
private final List<MultiChildDescriptor> myMultiChildDescriptors = new ArrayList<MultiChildDescriptor>();
private final List<Object> myConstants = new ArrayList<Object>();
private final List<PsiElement[]> myCodeBlocks = new ArrayList<PsiElement[]>();
public EquivalenceDescriptorBuilder() {
}
public List<SingleChildDescriptor> getSingleChildDescriptors() {
return mySingleChildDescriptors;
}
public List<MultiChildDescriptor> getMultiChildDescriptors() {
return myMultiChildDescriptors;
}
public List<Object> getConstants() {
return myConstants;
}
@NotNull
public List<PsiElement[]> getCodeBlocks() {
return myCodeBlocks;
}
public EquivalenceDescriptorBuilder codeBlock(@Nullable PsiElement[] block) {
myCodeBlocks.add(block);
return this;
}
public EquivalenceDescriptorBuilder element(@Nullable PsiElement element) {
return add(SingleChildDescriptor.MyType.DEFAULT, element);
}
public EquivalenceDescriptorBuilder elements(@Nullable PsiElement[] elements) {
return add(MultiChildDescriptor.MyType.DEFAULT, elements);
}
public EquivalenceDescriptorBuilder children(@Nullable PsiElement element) {
return add(SingleChildDescriptor.MyType.CHILDREN, element);
}
@NotNull
public EquivalenceDescriptorBuilder optionally(@Nullable PsiElement element) {
return add(SingleChildDescriptor.MyType.OPTIONALLY, element);
}
@NotNull
public EquivalenceDescriptorBuilder optionallyInPattern(@Nullable PsiElement element) {
return add(SingleChildDescriptor.MyType.OPTIONALLY_IN_PATTERN, element);
}
@NotNull
public EquivalenceDescriptorBuilder optionally(@Nullable PsiElement[] elements) {
return add(MultiChildDescriptor.MyType.OPTIONALLY, elements);
}
@NotNull
public EquivalenceDescriptorBuilder optionallyInPattern(@Nullable PsiElement[] elements) {
return add(MultiChildDescriptor.MyType.OPTIONALLY_IN_PATTERN, elements);
}
@NotNull
public EquivalenceDescriptorBuilder childrenOptionally(@Nullable PsiElement element) {
return add(SingleChildDescriptor.MyType.CHILDREN_OPTIONALLY, element);
}
@NotNull
public EquivalenceDescriptorBuilder childrenOptionallyInPattern(@Nullable PsiElement element) {
return add(SingleChildDescriptor.MyType.CHILDREN_OPTIONALLY_IN_PATTERN, element);
}
@NotNull
public EquivalenceDescriptorBuilder inAnyOrder(PsiElement[] elements) {
return add(MultiChildDescriptor.MyType.IN_ANY_ORDER, elements);
}
@NotNull
public EquivalenceDescriptorBuilder childrenInAnyOrder(@Nullable PsiElement element) {
return add(SingleChildDescriptor.MyType.CHILDREN_IN_ANY_ORDER, element);
}
@NotNull
public EquivalenceDescriptorBuilder constant(@Nullable Object constant) {
myConstants.add(constant);
return this;
}
private EquivalenceDescriptorBuilder add(MultiChildDescriptor.MyType type, PsiElement[] elements) {
myMultiChildDescriptors.add(new MultiChildDescriptor(type, elements));
return this;
}
private EquivalenceDescriptorBuilder add(SingleChildDescriptor.MyType type, PsiElement element) {
mySingleChildDescriptors.add(new SingleChildDescriptor(type, element));
return this;
}
}