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