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.ClassDescriptionNode;
import st.gravel.support.compiler.ast.ClassDescriptionNode.ClassDescriptionNode_Factory;
import st.gravel.support.compiler.ast.ClassNode;
import st.gravel.support.compiler.ast.MethodNode;
import st.gravel.support.compiler.ast.VariableDeclarationNode;
import st.gravel.support.compiler.ast.SharedDeclarationNode;
import st.gravel.support.compiler.ast.TraitUsageNode;
import st.gravel.support.compiler.ast.NodeVisitor;
import st.gravel.support.compiler.ast.SourceFile;
import st.gravel.support.compiler.ast.SystemNode;
import st.gravel.support.compiler.ast.Reference;
import st.gravel.support.compiler.ast.ClassReference;
import st.gravel.support.compiler.ast.AbsoluteReference;
import st.gravel.support.compiler.ast.Node;
import st.gravel.support.compiler.ast.SourcePrinter;
import st.gravel.support.compiler.ast.SourcePosition;
public class MetaclassNode extends ClassDescriptionNode implements Cloneable {
public static MetaclassNode_Factory factory = new MetaclassNode_Factory();
ClassNode _classNode;
SharedDeclarationNode[] _sharedVariables;
public static class MetaclassNode_Factory extends ClassDescriptionNode_Factory {
public MetaclassNode basicNew() {
MetaclassNode newInstance = new MetaclassNode();
newInstance.initialize();
return newInstance;
}
public MetaclassNode classNode_methods_instVars_sharedVariables_traitUsage_(final ClassNode _aClassNode, final MethodNode[] _anOrderedCollection, final VariableDeclarationNode[] _anArray, final SharedDeclarationNode[] _sharedVariables, final TraitUsageNode _traitUsage) {
return this.basicNew().initializeClassNode_methods_instVars_sharedVariables_traitUsage_(_aClassNode, _anOrderedCollection, _anArray, _sharedVariables, _traitUsage);
}
}
static public MetaclassNode _classNode_methods_instVars_sharedVariables_traitUsage_(Object receiver, final ClassNode _aClassNode, final MethodNode[] _anOrderedCollection, final VariableDeclarationNode[] _anArray, final SharedDeclarationNode[] _sharedVariables, final TraitUsageNode _traitUsage) {
return factory.classNode_methods_instVars_sharedVariables_traitUsage_(_aClassNode, _anOrderedCollection, _anArray, _sharedVariables, _traitUsage);
}
@Override
public <X> X accept_(final NodeVisitor<X> _visitor) {
return _visitor.visitMetaclassNode_(this);
}
@Override
public MetaclassNode allMethodsIn_do_(final SystemNode _aSystemNode, final st.gravel.support.jvm.Block1<Object, MethodNode> _aBlock) {
final ClassDescriptionNode _scn;
for (final MethodNode _temp1 : _methods) {
_aBlock.value_(_temp1);
}
_scn = this.superclassNodeIn_(_aSystemNode);
if (_scn == null) {
return MetaclassNode.this;
}
_scn.allMethodsIn_do_(_aSystemNode, _aBlock);
return this;
}
@Override
public MetaclassNode 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 MetaclassNode 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 MetaclassNode.this;
}
});
return this;
}
public ClassNode classNode() {
return _classNode;
}
public MetaclassNode copy() {
try {
MetaclassNode _temp1 = (MetaclassNode) this.clone();
_temp1.postCopy();
return _temp1;
} catch (CloneNotSupportedException e) {
throw new RuntimeException(e);
}
}
@Override
public MetaclassNode copyRemoveSelector_(final String _selector) {
return this.copy().pvtSetMethods_(st.gravel.support.jvm.ArrayExtensions.reject_(_methods, new st.gravel.support.jvm.Predicate1<MethodNode>() {
@Override
public boolean value_(final MethodNode _each) {
return st.gravel.support.jvm.StringExtensions.equals_(_each.selector(), _selector);
}
}));
}
@Override
public MetaclassNode copyReplaceMethodNode_(final MethodNode _aMethodNode) {
return this.copy().pvtSetMethods_(st.gravel.support.jvm.ArrayExtensions.collect_(_methods, ((st.gravel.support.jvm.Block1<MethodNode, MethodNode>) (new st.gravel.support.jvm.Block1<MethodNode, MethodNode>() {
@Override
public MethodNode value_(final MethodNode _each) {
if (st.gravel.support.jvm.StringExtensions.equals_(_each.selector(), _aMethodNode.selector())) {
return _aMethodNode;
} else {
return _each;
}
}
}))));
}
public MetaclassNode_Factory factory() {
return factory;
}
@Override
public SourceFile findSourceFile() {
if (_sourcePosition != null) {
return _sourcePosition.sourceFile();
}
if (_classNode.sourcePosition() == null) {
return null;
}
return _classNode.sourcePosition().sourceFile();
}
@Override
public MetaclassNode flattenTraitsIn_(final SystemNode _aSystemNode) {
return _traitUsage.flattenMetaclassNode_in_(this, _aSystemNode);
}
public MetaclassNode initializeClassNode_methods_instVars_sharedVariables_traitUsage_(final ClassNode _aClassNode, final MethodNode[] _anOrderedCollection, final VariableDeclarationNode[] _anArray, final SharedDeclarationNode[] _aSharedVariables, final TraitUsageNode _anObject) {
_classNode = _aClassNode;
_methods = _anOrderedCollection;
_instVars = _anArray;
_sharedVariables = _aSharedVariables;
_traitUsage = _anObject;
this.initialize();
return this;
}
@Override
public MetaclassNode initializeMethods_instVars_(final MethodNode[] _anOrderedCollection, final VariableDeclarationNode[] _anArray) {
_methods = _anOrderedCollection;
_instVars = _anArray;
this.initialize();
return this;
}
@Override
public VariableDeclarationNode[] instVars() {
return _instVars;
}
@Override
public boolean isMeta() {
return true;
}
@Override
public boolean isNilClass() {
return false;
}
@Override
public boolean isSystemTest() {
return false;
}
@Override
public boolean isTrait() {
return _classNode.isTrait();
}
@Override
public MetaclassNode localVarNamesDo_(final st.gravel.support.jvm.Block1<Object, String> _aBlock) {
return this;
}
@Override
public MetaclassNode meta() {
return this;
}
@Override
public st.gravel.core.Symbol[] namespace() {
return _classNode.namespace();
}
@Override
public MetaclassNode nodesDo_(final st.gravel.support.jvm.Block1<Object, Node> _aBlock) {
for (final MethodNode _temp1 : _methods) {
_aBlock.value_(_temp1);
}
for (final VariableDeclarationNode _temp2 : _instVars) {
_aBlock.value_(_temp2);
}
return this;
}
@Override
public st.gravel.core.Symbol packageName() {
final st.gravel.core.Symbol _sp;
_sp = super.packageName();
if (_sp != null) {
return _sp;
}
return _classNode.packageName();
}
@Override
public MetaclassNode prettySourceOn_(final StringBuilder _aStream) {
SourcePrinter.factory.on_(_aStream).visit_(this);
return this;
}
@Override
public MetaclassNode printOn_(final StringBuilder _aStream) {
super.printOn_(_aStream);
_aStream.append('[');
_aStream.append(']');
return this;
}
public MetaclassNode pvtSetClassNode_(final ClassNode _aClassNode) {
_classNode = _aClassNode;
return this;
}
@Override
public MetaclassNode pvtSetInstVars_(final VariableDeclarationNode[] _arr) {
_instVars = _arr;
return this;
}
@Override
public MetaclassNode pvtSetMethods_(final MethodNode[] _anArray) {
_methods = _anArray;
return this;
}
public MetaclassNode pvtSetSharedVariables_(final SharedDeclarationNode[] _anArray) {
_sharedVariables = _anArray;
return this;
}
@Override
public MetaclassNode pvtSetSourcePosition_(final SourcePosition _aSourcePosition) {
_sourcePosition = _aSourcePosition;
return this;
}
@Override
public MetaclassNode pvtSetTraitUsage_(final TraitUsageNode _aTraitUsageNode) {
_traitUsage = _aTraitUsageNode;
return this;
}
public MetaclassNode pvtWithClassNode_(final ClassNode _aClassNode) {
if (_classNode == _aClassNode) {
return MetaclassNode.this;
}
return this.copy().pvtSetClassNode_(_aClassNode);
}
@Override
public Reference reference() {
return ClassReference.factory.reference_(_classNode.reference());
}
@Override
public MetaclassNode selectorsDo_(final st.gravel.support.jvm.Block1<Object, String> _aBlock) {
for (final MethodNode _m : _methods) {
_aBlock.value_(_m.selector());
}
return this;
}
public SharedDeclarationNode sharedVariableAt_ifAbsent_(final String _aName, final st.gravel.support.jvm.Block0<SharedDeclarationNode> _aBlock) {
return st.gravel.support.jvm.ArrayExtensions.detect_ifNone_(_sharedVariables, new st.gravel.support.jvm.Predicate1<SharedDeclarationNode>() {
@Override
public boolean value_(final SharedDeclarationNode _each) {
return st.gravel.support.jvm.StringExtensions.equals_(_each.name(), _aName);
}
}, _aBlock);
}
public SharedDeclarationNode[] sharedVariables() {
return _sharedVariables;
}
@Override
public MetaclassNode sourceOn_(final StringBuilder _aStream) {
_classNode.sourceOn_(_aStream);
_aStream.append(" class");
return this;
}
@Override
public Reference superclassReference() {
final Reference _csr;
_csr = _classNode.superclassReference();
if (_csr == null) {
return null;
}
return ClassReference.factory.reference_(((AbsoluteReference) _csr));
}
@Override
public Reference superclassReferenceForMethodLookup() {
final Reference _csr;
_csr = _classNode.superclassReference();
if (_csr == null) {
return AbsoluteReference.factory.path_(new st.gravel.core.Symbol[] { st.gravel.core.Symbol.value("st"), st.gravel.core.Symbol.value("gravel"), st.gravel.core.Symbol.value("lang"), st.gravel.core.Symbol.value("Class") });
}
return ClassReference.factory.reference_(((AbsoluteReference) _csr));
}
@Override
public MetaclassNode withAllNodesDo_(final st.gravel.support.jvm.Block1<Object, Node> _aBlock) {
_aBlock.value_(this);
this.allNodesDo_(_aBlock);
return this;
}
@Override
public MetaclassNode 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 MetaclassNode withExtraMethods_(final MethodNode[] _extraMethods) {
return st.gravel.support.jvm.ArrayExtensions.inject_into_(_extraMethods, this, ((st.gravel.support.jvm.Block2<MetaclassNode, MetaclassNode, MethodNode>) (new st.gravel.support.jvm.Block2<MetaclassNode, MetaclassNode, MethodNode>() {
@Override
public MetaclassNode value_value_(final MetaclassNode _cdn, final MethodNode _m) {
if (_cdn.includesSelector_(_m.selector())) {
return _cdn;
} else {
return _cdn.withMethodNode_(_m);
}
}
})));
}
@Override
public MetaclassNode withInstVar_(final VariableDeclarationNode _aVariableDeclarationNode) {
return this.copy().pvtSetInstVars_(st.gravel.support.jvm.ArrayExtensions.copyWith_(_instVars, _aVariableDeclarationNode));
}
@Override
public MetaclassNode withMethodNode_(final MethodNode _aMethodNode) {
final MethodNode _current;
_current = this.methodOrNilAt_(_aMethodNode.selector());
if (_current != null) {
throw new RuntimeException("Duplicate selector: " + _aMethodNode.selector());
}
return this.copy().pvtSetMethods_(st.gravel.support.jvm.ArrayExtensions.copyWith_(_methods, _aMethodNode));
}
@Override
public MetaclassNode withMethodNode_ofTrait_(final MethodNode _aMethodNode, final Reference _aReference) {
return this.withMethodNode_(_aMethodNode.ofTrait_(_aReference));
}
@Override
public MetaclassNode withMethods_(final MethodNode[] _anArray) {
return this.copy().pvtSetMethods_(_anArray);
}
public MetaclassNode withSharedVariable_(final SharedDeclarationNode _aSharedDeclarationNode) {
return this.copy().pvtSetSharedVariables_(st.gravel.support.jvm.ArrayExtensions.copyWith_(_sharedVariables, _aSharedDeclarationNode));
}
@Override
public MetaclassNode withSourcePosition_(final SourcePosition _aSourcePosition) {
if (_sourcePosition == _aSourcePosition) {
return MetaclassNode.this;
}
return this.copy().pvtSetSourcePosition_(_aSourcePosition);
}
@Override
public MetaclassNode withTrait_(final TraitUsageNode _aTraitUsageNode) {
return this.copy().pvtSetTraitUsage_(_traitUsage.withTrait_(_aTraitUsageNode));
}
}