package st.gravel.support.compiler.ast;
/*
This file is automatically generated from typed smalltalk source. Do not edit by hand.
(C) AG5.com
*/
import java.math.BigInteger;
import st.gravel.support.jvm.NonLocalReturn;
import st.gravel.support.compiler.ast.SystemNode;
import java.util.Set;
import st.gravel.support.compiler.ast.Reference;
import st.gravel.support.compiler.ast.ClassDescriptionNode;
import java.util.HashSet;
public class TraitFlattener extends Object implements Cloneable {
public static TraitFlattener_Factory factory = new TraitFlattener_Factory();
java.util.Set<Reference> _done;
SystemNode _intermediate;
SystemNode _start;
java.util.Set<Reference> _todo;
public static class TraitFlattener_Factory extends st.gravel.support.jvm.SmalltalkFactory {
public TraitFlattener basicNew() {
TraitFlattener newInstance = new TraitFlattener();
newInstance.initialize();
return newInstance;
}
public TraitFlattener start_(final SystemNode _aSystemNode) {
return this.basicNew().initializeStart_(_aSystemNode);
}
}
static public TraitFlattener _start_(Object receiver, final SystemNode _aSystemNode) {
return factory.start_(_aSystemNode);
}
public TraitFlattener copy() {
try {
TraitFlattener _temp1 = (TraitFlattener) this.clone();
_temp1.postCopy();
return _temp1;
} catch (CloneNotSupportedException e) {
throw new RuntimeException(e);
}
}
public TraitFlattener_Factory factory() {
return factory;
}
public TraitFlattener flattenTodos() {
_done.addAll(_todo);
_intermediate = SystemNode.factory.classDescriptionNodes_namespaceNodes_(st.gravel.support.jvm.DictionaryExtensions.collect_(_intermediate.classDescriptionNodes(), ((st.gravel.support.jvm.Block1<ClassDescriptionNode, ClassDescriptionNode>) (new st.gravel.support.jvm.Block1<ClassDescriptionNode, ClassDescriptionNode>() {
@Override
public ClassDescriptionNode value_(final ClassDescriptionNode _each) {
if (_todo.contains(_each.reference())) {
return _each.flattenTraitsIn_(_intermediate);
} else {
return _each;
}
}
}))), _start.namespaceNodes());
return this;
}
public SystemNode flattenTraits() {
_intermediate = _start;
_done = new java.util.HashSet();
boolean _temp1 = false;
while (!_temp1) {
TraitFlattener.this.selectFlattenables();
_temp1 = _todo.size() == 0;
if (!_temp1) {
TraitFlattener.this.flattenTodos();
}
}
this.validate();
return _intermediate;
}
public TraitFlattener initialize() {
return this;
}
public TraitFlattener initializeStart_(final SystemNode _aSystemNode) {
_start = _aSystemNode;
this.initialize();
return this;
}
public TraitFlattener postCopy() {
return this;
}
public TraitFlattener selectFlattenables() {
_todo = new java.util.HashSet();
for (final ClassDescriptionNode _each : _intermediate.classDescriptionNodes().values()) {
if ((!_done.contains(_each.reference())) && st.gravel.support.jvm.ArrayExtensions.allSatisfy_(_each.traitUsage().prerequisiteReferences(), new st.gravel.support.jvm.Predicate1<Reference>() {
@Override
public boolean value_(final Reference _pr) {
return _done.contains(_pr);
}
})) {
_todo.add(_each.reference());
}
}
return this;
}
public SystemNode start() {
return _start;
}
public TraitFlattener validate() {
final java.util.Set<Reference> _unflattenable;
_unflattenable = st.gravel.support.jvm.SetExtensions.select_(_intermediate.classDescriptionNodes().keySet(), new st.gravel.support.jvm.Predicate1<Reference>() {
@Override
public boolean value_(final Reference _each) {
return !_done.contains(_each);
}
});
if (_unflattenable.size() != 0) {
throw new RuntimeException("Unflattenable traits found: " + _unflattenable.toArray(new Reference[_unflattenable.size()]).toString());
}
return this;
}
}