package me.tomassetti.turin.parser.ast.properties;
import me.tomassetti.turin.parser.ast.Node;
import me.tomassetti.turin.parser.ast.expressions.Expression;
import me.tomassetti.turin.parser.ast.typeusage.TypeUsageNode;
import me.tomassetti.turin.symbols.Symbol;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
public class PropertyDefinition extends Node implements Symbol {
private String name;
private TypeUsageNode type;
private Optional<Expression> initialValue;
private Optional<Expression> defaultValue;
private List<PropertyConstraint> constraints;
public List<PropertyConstraint> getConstraints() {
return constraints;
}
public Optional<Expression> getInitialValue() {
return initialValue;
}
public Optional<Expression> getDefaultValue() {
return defaultValue;
}
public PropertyDefinition(String name, TypeUsageNode type, Optional<Expression> initialValue, Optional<Expression> defaultValue,
List<PropertyConstraint> constraints) {
this.name = name;
this.type = type;
this.type.setParent(this);
this.initialValue = initialValue;
if (initialValue.isPresent()) {
initialValue.get().setParent(this);
}
this.defaultValue = defaultValue;
if (defaultValue.isPresent()) {
defaultValue.get().setParent(this);
}
this.constraints = constraints;
this.constraints.forEach((c)->c.setParent(PropertyDefinition.this));
}
public String getName() {
return name;
}
public TypeUsageNode getType() {
return type;
}
@Override
public Iterable<Node> getChildren() {
List<Node> children = new ArrayList<>();
children.add(type);
if (initialValue.isPresent()) {
children.add(initialValue.get());
}
if (defaultValue.isPresent()) {
children.add(defaultValue.get());
}
children.addAll(constraints);
return children;
}
@Override
public String toString() {
return "PropertyDefinition{" +
"name='" + name + '\'' +
", type=" + type +
", initialValue=" + initialValue +
", defaultValue=" + defaultValue +
", constraints=" + constraints +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof PropertyDefinition)) return false;
PropertyDefinition that = (PropertyDefinition) o;
if (!constraints.equals(that.constraints)) return false;
if (!defaultValue.equals(that.defaultValue)) return false;
if (!initialValue.equals(that.initialValue)) return false;
if (!name.equals(that.name)) return false;
if (!type.equals(that.type)) return false;
return true;
}
@Override
public int hashCode() {
int result = name.hashCode();
result = 31 * result + type.hashCode();
result = 31 * result + initialValue.hashCode();
result = 31 * result + defaultValue.hashCode();
result = 31 * result + constraints.hashCode();
return result;
}
public String getQualifiedName() {
return contextName() + "." + name;
}
}