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.TraitUsageNode;
import st.gravel.support.compiler.ast.TraitUsageNode.TraitUsageNode_Factory;
import st.gravel.support.compiler.ast.SimpleTraitUsageNode;
import st.gravel.support.compiler.ast.NodeVisitor;
import st.gravel.support.compiler.ast.SystemNode;
import st.gravel.support.compiler.ast.MethodNode;
import st.gravel.support.compiler.ast.ClassDescriptionNode;
import java.util.Map;
import java.util.List;
import java.util.HashMap;
import java.util.ArrayList;
import st.gravel.support.compiler.ast.SequenceNode;
import st.gravel.support.compiler.ast.GlobalReadNode;
import st.gravel.support.compiler.ast.AbsoluteReference;
import st.gravel.support.compiler.ast.StringLiteralNode;
import st.gravel.support.compiler.ast.Node;
import st.gravel.support.compiler.ast.Reference;
import st.gravel.support.compiler.ast.SourcePrinter;
import st.gravel.support.compiler.ast.SourcePosition;
public class CompositeTraitUsageNode extends TraitUsageNode implements Cloneable {
public static CompositeTraitUsageNode_Factory factory = new CompositeTraitUsageNode_Factory();
SimpleTraitUsageNode[] _components;
public static class CompositeTraitUsageNode_Factory extends TraitUsageNode_Factory {
public CompositeTraitUsageNode basicNew() {
CompositeTraitUsageNode newInstance = new CompositeTraitUsageNode();
newInstance.initialize();
return newInstance;
}
public CompositeTraitUsageNode components_(final SimpleTraitUsageNode[] _anArray) {
return this.basicNew().initializeComponents_(_anArray);
}
}
static public CompositeTraitUsageNode _components_(Object receiver, final SimpleTraitUsageNode[] _anArray) {
return factory.components_(_anArray);
}
@Override
public <X> X accept_(final NodeVisitor<X> _visitor) {
return _visitor.visitCompositeTraitUsageNode_(this);
}
@Override
public CompositeTraitUsageNode allMethodsIn_do_(final SystemNode _aSystemNode, final st.gravel.support.jvm.Block1<Object, MethodNode> _aBlock) {
for (final SimpleTraitUsageNode _each : _components) {
_each.allMethodsIn_do_(_aSystemNode, _aBlock);
}
return this;
}
@Override
public CompositeTraitUsageNode allNodesDo_(final st.gravel.support.jvm.Block1<Object, Node> _aBlock) {
this.nodesDo_(new st.gravel.support.jvm.Block1<Object, Node>() {
@Override
public Object value_(final Node _each) {
return _each.withAllNodesDo_(_aBlock);
}
});
return this;
}
@Override
public CompositeTraitUsageNode allNodesDo_pruneWhere_(final st.gravel.support.jvm.Block1<Object, Node> _aBlock, final st.gravel.support.jvm.Block1<Boolean, Node> _pruneBlock) {
this.nodesDo_(new st.gravel.support.jvm.Block1<Object, Node>() {
@Override
public Object value_(final Node _each) {
if (!_pruneBlock.value_(_each)) {
return _each.withAllNodesDo_pruneWhere_(_aBlock, _pruneBlock);
}
return CompositeTraitUsageNode.this;
}
});
return this;
}
@Override
public SimpleTraitUsageNode[] components() {
return _components;
}
public SimpleTraitUsageNode[] componentsDefining_in_(final String _selector, final SystemNode _aSystemNode) {
return st.gravel.support.jvm.ArrayExtensions.select_(_components, new st.gravel.support.jvm.Predicate1<SimpleTraitUsageNode>() {
@Override
public boolean value_(final SimpleTraitUsageNode _each) {
return _each.canUnderstand_in_(_selector, _aSystemNode);
}
});
}
public boolean conflicts_with_(final MethodNode _other, final MethodNode _method) {
return !st.gravel.support.jvm.StringExtensions.equals_(_other.sourceString(), _method.sourceString());
}
public CompositeTraitUsageNode copy() {
try {
CompositeTraitUsageNode _temp1 = (CompositeTraitUsageNode) this.clone();
_temp1.postCopy();
return _temp1;
} catch (CloneNotSupportedException e) {
throw new RuntimeException(e);
}
}
public CompositeTraitUsageNode_Factory factory() {
return factory;
}
@Override
public ClassDescriptionNode flattenClassDescriptionNode_in_(final ClassDescriptionNode _aClassDescriptionNode, final SystemNode _aSystemNode) {
final ClassDescriptionNode[] _n;
final Map<String, MethodNode>[] _definitionInOtherTraits;
final List<MethodNode>[] _requirements;
_n = new ClassDescriptionNode[1];
_definitionInOtherTraits = new Map[1];
_requirements = new List[1];
_n[0] = _aClassDescriptionNode;
_definitionInOtherTraits[0] = new java.util.HashMap<String, MethodNode>();
_requirements[0] = new java.util.ArrayList();
for (final SimpleTraitUsageNode _component : _components) {
_component.allMethodsIn_do_(_aSystemNode, new st.gravel.support.jvm.Block1<Object, MethodNode>() {
@Override
public Object value_(final MethodNode _method) {
final boolean _canUnderstand;
final String _selector;
_selector = _method.selector();
_canUnderstand = _aClassDescriptionNode.canUnderstand_in_(_selector, _aSystemNode);
if (_method.isTraitRequirement()) {
if (!_canUnderstand) {
return _requirements[0].add(_method.ofTrait_(_component.reference()));
}
} else {
if (!_aClassDescriptionNode.includesSelector_(_selector)) {
final MethodNode _other;
MethodNode _temp1 = _definitionInOtherTraits[0].get(_selector);
_other = ((MethodNode) _temp1);
if (_other != null) {
if (CompositeTraitUsageNode.this.conflicts_with_(_other, _method)) {
_n[0] = _n[0].copyReplaceMethodNode_(_method.withBody_(SequenceNode.factory.statement_(GlobalReadNode.factory.namespace_name_(AbsoluteReference.factory.object(), "TraitConflict").send_with_("raiseSignal:", StringLiteralNode.factory.value_(CompositeTraitUsageNode.this.traitConflictStringFor_in_(_selector, _aSystemNode))))));
}
} else {
_n[0] = _n[0].withMethodNode_ofTrait_(_method, _component.reference());
}
}
return _definitionInOtherTraits[0].put(_method.selector(), _method);
}
return CompositeTraitUsageNode.this;
}
});
}
for (final MethodNode _method : _requirements[0]) {
if (!(_definitionInOtherTraits[0].containsKey(_method.selector()) || _n[0].includesSelector_(_method.selector()))) {
_n[0] = _n[0].withMethodNode_(CompositeTraitUsageNode.this.newTraitRequirementNotDefinedFor_(_method));
}
}
return _n[0];
}
public CompositeTraitUsageNode initializeComponents_(final SimpleTraitUsageNode[] _anArray) {
_components = _anArray;
this.initialize();
return this;
}
@Override
public CompositeTraitUsageNode localVarNamesDo_(final st.gravel.support.jvm.Block1<Object, String> _aBlock) {
return this;
}
@Override
public CompositeTraitUsageNode nodesDo_(final st.gravel.support.jvm.Block1<Object, Node> _aBlock) {
for (final SimpleTraitUsageNode _temp1 : _components) {
_aBlock.value_(_temp1);
}
return this;
}
@Override
public Reference[] prerequisiteReferences() {
return st.gravel.support.jvm.ArrayExtensions.collect_(_components, ((st.gravel.support.jvm.Block1<Reference, SimpleTraitUsageNode>) (new st.gravel.support.jvm.Block1<Reference, SimpleTraitUsageNode>() {
@Override
public Reference value_(final SimpleTraitUsageNode _each) {
return (Reference) _each.reference();
}
})));
}
@Override
public CompositeTraitUsageNode prettySourceOn_(final StringBuilder _aStream) {
SourcePrinter.factory.on_(_aStream).visit_(this);
return this;
}
@Override
public CompositeTraitUsageNode printOn_(final StringBuilder _aStream) {
final String _title;
_title = this.factory().toString();
_aStream.append(st.gravel.support.jvm.CharacterExtensions.isVowel(_title.charAt(0)) ? "an " : "a ");
_aStream.append(_title);
_aStream.append('[');
this.sourceOn_(_aStream);
_aStream.append(']');
return this;
}
@Override
public CompositeTraitUsageNode pvtSetSourcePosition_(final SourcePosition _aSourcePosition) {
_sourcePosition = _aSourcePosition;
return this;
}
@Override
public CompositeTraitUsageNode sourceOn_(final StringBuilder _aStream) {
boolean _temp1 = true;
for (final SimpleTraitUsageNode _each : _components) {
if (_temp1) {
_temp1 = false;
} else {
_aStream.append(" + ");
}
_each.sourceOn_(_aStream);
}
return this;
}
public String traitConflictStringFor_in_(final String _selector, final SystemNode _aSystemNode) {
return "TraitConflict: #" + _selector.toString() + " defined in: " + st.gravel.support.jvm.ArrayExtensions.join_with_(this.componentsDefining_in_(_selector, _aSystemNode), ((st.gravel.support.jvm.Block1<String, SimpleTraitUsageNode>) (new st.gravel.support.jvm.Block1<String, SimpleTraitUsageNode>() {
@Override
public String value_(final SimpleTraitUsageNode _each) {
return (String) _each.reference().toString();
}
})), ", ");
}
@Override
public CompositeTraitUsageNode withAllNodesDo_(final st.gravel.support.jvm.Block1<Object, Node> _aBlock) {
_aBlock.value_(this);
this.allNodesDo_(_aBlock);
return this;
}
@Override
public CompositeTraitUsageNode withAllNodesDo_pruneWhere_(final st.gravel.support.jvm.Block1<Object, Node> _aBlock, final st.gravel.support.jvm.Block1<Boolean, Node> _pruneBlock) {
_aBlock.value_(this);
this.allNodesDo_pruneWhere_(_aBlock, _pruneBlock);
return this;
}
@Override
public CompositeTraitUsageNode withSourcePosition_(final SourcePosition _aSourcePosition) {
if (_sourcePosition == _aSourcePosition) {
return CompositeTraitUsageNode.this;
}
return this.copy().pvtSetSourcePosition_(_aSourcePosition);
}
@Override
public TraitUsageNode withTrait_(final TraitUsageNode _aTraitUsageNode) {
return CompositeTraitUsageNode.factory.components_(st.gravel.support.jvm.ArrayExtensions.copyWithAll_(_aTraitUsageNode.components(), _components));
}
}