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; } }