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