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.SystemDefinitionNode; import st.gravel.support.compiler.ast.SystemNode; import java.util.Map; import st.gravel.support.compiler.ast.Reference; import st.gravel.support.compiler.ast.ClassNode; import st.gravel.support.compiler.ast.ClassDescriptionNode; import st.gravel.support.compiler.ast.NamespaceNode; import java.util.HashMap; import st.gravel.support.compiler.ast.AbsoluteReference; import st.gravel.support.compiler.ast.PackageNode; public class PackageNodeMerger extends Object implements Cloneable { public static PackageNodeMerger_Factory factory = new PackageNodeMerger_Factory(); SystemDefinitionNode _systemDefinitionNode; public static class PackageNodeMerger_Factory extends st.gravel.support.jvm.SmalltalkFactory { public PackageNodeMerger basicNew() { PackageNodeMerger newInstance = new PackageNodeMerger(); newInstance.initialize(); return newInstance; } public PackageNodeMerger systemDefinitionNode_(final SystemDefinitionNode _aSystemDefinitionNode) { return ((PackageNodeMerger) this.basicNew().initializeSystemDefinitionNode_(_aSystemDefinitionNode)); } } static public PackageNodeMerger _systemDefinitionNode_(Object receiver, final SystemDefinitionNode _aSystemDefinitionNode) { return factory.systemDefinitionNode_(_aSystemDefinitionNode); } public PackageNodeMerger copy() { try { PackageNodeMerger _temp1 = (PackageNodeMerger) this.clone(); _temp1.postCopy(); return _temp1; } catch (CloneNotSupportedException e) { throw new RuntimeException(e); } } public PackageNodeMerger_Factory factory() { return factory; } public PackageNodeMerger initialize() { return this; } public PackageNodeMerger initializeSystemDefinitionNode_(final SystemDefinitionNode _aSystemDefinitionNode) { _systemDefinitionNode = _aSystemDefinitionNode; this.initialize(); return this; } public SystemNode load() { final Map<Reference, ClassNode>[] _classNodes; final Map<Reference, ClassDescriptionNode>[] _classDescriptionNodes; final Map<Reference, NamespaceNode>[] _namespaceNodes; _classDescriptionNodes = new Map[1]; _classNodes = new Map[1]; _namespaceNodes = new Map[1]; _classNodes[0] = new java.util.HashMap<Reference, ClassNode>(); _namespaceNodes[0] = new java.util.HashMap<Reference, NamespaceNode>(); this.packageClassNodesDo_(new st.gravel.support.jvm.Block1<Object, ClassNode>() { @Override public Object value_(final ClassNode _classNode) { if (!_classNode.isExtension()) { final Reference _reference; _reference = _classNode.reference(); if (_classNodes[0].containsKey(_reference)) { throw new RuntimeException("Class " + _reference.toString() + " defined twice"); } return _classNodes[0].put(_reference, _classNode); } return PackageNodeMerger.this; } }); this.packageClassNodesDo_(new st.gravel.support.jvm.Block1<Object, ClassNode>() { @Override public Object value_(final ClassNode _classNode) { if (_classNode.isExtension()) { final Reference _reference; _reference = _classNode.reference(); if (!_classNodes[0].containsKey(_reference)) { throw new RuntimeException("Can\'t extend Class " + _reference.toString() + "; not defined yet"); } return _classNodes[0].put(_reference, _classNodes[0].get(_reference).mergedWithExtension_(_classNode)); } return PackageNodeMerger.this; } }); _classDescriptionNodes[0] = new java.util.HashMap<Reference, ClassDescriptionNode>(); for (final ClassNode _classNode : _classNodes[0].values()) { _classDescriptionNodes[0].put(_classNode.reference(), _classNode); _classDescriptionNodes[0].put(_classNode.metaclassNode().reference(), _classNode.metaclassNode()); } this.packageNamespaceNodesDo_(new st.gravel.support.jvm.Block1<Object, NamespaceNode>() { @Override public Object value_(final NamespaceNode _namespaceNode) { final Reference _reference; _reference = _namespaceNode.reference(); if (_namespaceNodes[0].containsKey(_reference)) { return _namespaceNodes[0].put(_reference, _namespaceNode.mergeWith_(_namespaceNodes[0].get(_reference))); } else { return _namespaceNodes[0].put(_reference, _namespaceNode); } } }); for (final Reference _ref : _classNodes[0].keySet()) { final AbsoluteReference _namespace; _namespace = _ref.namespace(); NamespaceNode _temp1 = _namespaceNodes[0].get(_namespace); if (_temp1 == null) { NamespaceNode _temp2 = NamespaceNode.factory.for_(_namespace); _namespaceNodes[0].put(_namespace, _temp2); _temp1 = _temp2; } } return SystemNode.factory.classDescriptionNodes_namespaceNodes_(_classDescriptionNodes[0], _namespaceNodes[0]).flattenTraits(); } public PackageNodeMerger packageClassNodesDo_(final st.gravel.support.jvm.Block1<Object, ClassNode> _aBlock) { for (final PackageNode _packageNode : _systemDefinitionNode.packageNodes()) { for (final ClassNode _temp1 : _packageNode.classes()) { _aBlock.value_(_temp1); } } return this; } public PackageNodeMerger packageNamespaceNodesDo_(final st.gravel.support.jvm.Block1<Object, NamespaceNode> _aBlock) { for (final PackageNode _packageNode : _systemDefinitionNode.packageNodes()) { for (final NamespaceNode _temp1 : _packageNode.namespaces()) { _aBlock.value_(_temp1); } } return this; } public PackageNodeMerger postCopy() { return this; } public SystemDefinitionNode systemDefinitionNode() { return _systemDefinitionNode; } }