package de.skuzzle.polly.core.parser.ast.expressions.literals;
import java.util.List;
import de.skuzzle.polly.core.parser.Position;
import de.skuzzle.polly.core.parser.ast.declarations.types.Type;
import de.skuzzle.polly.core.parser.ast.expressions.Expression;
import de.skuzzle.polly.core.parser.ast.visitor.ASTTraversal;
import de.skuzzle.polly.core.parser.ast.visitor.ASTTraversalException;
import de.skuzzle.polly.core.parser.ast.visitor.ASTVisitor;
import de.skuzzle.polly.core.parser.ast.visitor.Transformation;
import de.skuzzle.polly.tools.Equatable;
/**
* Represents a list literal which consists of a list of expressions which all have the
* same types.
*
* @author Simon Taddiken
*/
public class ListLiteral extends Literal {
private List<Expression> content;
/**
* Creates a new ListLiteral.
*
* @param position Position of this literal within the source.
* @param content List of expressions in this list literal.
*/
public ListLiteral(Position position, List<Expression> content) {
super(position, Type.UNKNOWN);
this.content = content;
}
/**
* Creates a new ListLiteral for which the type of its content is already known.
*
* @param position Position of this literal within the source.
* @param content List of expressions in this list literal.
* @param subType Type of all expressions in the list.
*/
public ListLiteral(Position position, List<Expression> content, Type subType) {
this(position, content);
this.setUnique(subType.listOf());
}
/**
* Gets the content of this literal.
*
* @return All expressions in this literal.
*/
public List<Expression> getContent() {
return this.content;
}
/**
* Sets the content of this literal.
*
* @param content New exprssion list.
*/
public void setContent(List<Expression> content) {
this.content = content;
}
@Override
public Literal castTo(Type type) throws ASTTraversalException {
return super.castTo(type);
}
@Override
public String format(LiteralFormatter formatter) {
return formatter.formatList(this);
}
@Override
public boolean visit(ASTVisitor visitor) throws ASTTraversalException {
return visitor.visit(this);
}
@Override
public Expression transform(Transformation transformation)
throws ASTTraversalException {
return transformation.transformList(this);
}
@Override
public boolean traverse(ASTTraversal visitor) throws ASTTraversalException {
switch (visitor.before(this)) {
case ASTTraversal.SKIP: return true;
case ASTTraversal.ABORT: return false;
}
for (final Expression exp : this.content) {
if (!exp.traverse(visitor)) {
return false;
}
}
return visitor.after(this) == ASTTraversal.CONTINUE;
}
@Override
public Class<?> getEquivalenceClass() {
return ListLiteral.class;
}
@Override
public boolean actualEquals(Equatable o) {
final ListLiteral other = (ListLiteral) o;
return this.content.equals(other.content);
}
}