private MethodDeclaration createSlotSpec() {
SimpleName valueName = factory.newSimpleName("value");
SimpleName slotName = factory.newSimpleName("slot");
List<Statement> statements = Lists.create();
statements.add(new ExpressionBuilder(factory, slotName)
.method(SortableSlot.NAME_BEGIN, Models.toLiteral(factory, slot.getSlotNumber()))
.toStatement());
if (slot.getSortProperties().isEmpty()) {
statements.add(new ExpressionBuilder(factory, slotName)
.method(SortableSlot.NAME_ADD_RANDOM)
.toStatement());
}
for (DataClass.Property property : slot.getSortProperties()) {
if (property.canNull()) {
statements.add(factory.newIfStatement(
property.createIsNull(valueName),
factory.newBlock(new Statement[] {
new ExpressionBuilder(factory, slotName)
.method(SortableSlot.NAME_ADD_BYTE, Models.toLiteral(factory, 1))
.toStatement(),
new ExpressionBuilder(factory, slotName)
.method(SortableSlot.NAME_ADD_RANDOM)
.toStatement(),
}),
factory.newBlock(new Statement[] {
new ExpressionBuilder(factory, slotName)
.method(SortableSlot.NAME_ADD_BYTE, Models.toLiteral(factory, 0))
.toStatement(),
new ExpressionBuilder(factory, slotName)
.method(SortableSlot.NAME_ADD, property.createGetter(valueName))
.toStatement(),
})));
} else {
statements.add(new ExpressionBuilder(factory, slotName)
.method(SortableSlot.NAME_ADD, property.createGetter(valueName))
.toStatement());
}
}
return factory.newMethodDeclaration(