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.Formatter;
import st.gravel.support.compiler.ast.Expression;
import st.gravel.support.compiler.ast.NilLiteralNode;
import st.gravel.support.compiler.ast.StringLiteralNode;
import st.gravel.support.compiler.ast.Reference;
import st.gravel.support.compiler.ast.PackageNode;
import st.gravel.support.compiler.ast.ClassNode;
import st.gravel.support.compiler.ast.NamespaceNode;
import st.gravel.support.compiler.ast.VariableNode;
import st.gravel.support.compiler.ast.SharedDeclarationNode;
import st.gravel.support.compiler.ast.Node;
import st.gravel.support.compiler.ast.TraitUsageToDirectiveConverter;
import st.gravel.support.compiler.ast.ClassTraitUsageToDirectiveConverter;
import st.gravel.support.compiler.ast.VariableDeclarationNode;
import java.util.Map;
import java.util.Map.*;
import st.gravel.support.compiler.ast.MethodNode;
import java.util.HashMap;
import st.gravel.support.compiler.ast.AbsoluteReference;
public class DiskClassWriter extends Object implements Cloneable {
public static DiskClassWriter_Factory factory = new DiskClassWriter_Factory();
Formatter _formatter;
java.io.File _root;
public static class DiskClassWriter_Factory extends st.gravel.support.jvm.SmalltalkFactory {
public DiskClassWriter basicNew() {
DiskClassWriter newInstance = new DiskClassWriter();
newInstance.initialize();
return newInstance;
}
public DiskClassWriter root_formatter_(final java.io.File _aFilename, final Formatter _aVWFormatter) {
return this.basicNew().initializeRoot_formatter_(_aFilename, _aVWFormatter);
}
}
static public DiskClassWriter _root_formatter_(Object receiver, final java.io.File _aFilename, final Formatter _aVWFormatter) {
return factory.root_formatter_(_aFilename, _aVWFormatter);
}
public Expression asLiteralNode_(final String _aValue) {
if (_aValue == null) {
return NilLiteralNode.factory.basicNew();
}
return StringLiteralNode.factory.value_(_aValue);
}
public DiskClassWriter copy() {
try {
DiskClassWriter _temp1 = (DiskClassWriter) this.clone();
_temp1.postCopy();
return _temp1;
} catch (CloneNotSupportedException e) {
throw new RuntimeException(e);
}
}
public DiskClassWriter_Factory factory() {
return factory;
}
public Formatter formatter() {
return _formatter;
}
public DiskClassWriter initialize() {
return this;
}
public DiskClassWriter initializeRoot_formatter_(final java.io.File _anUnixFilename, final Formatter _aVWFormatter) {
_root = _anUnixFilename;
_formatter = _aVWFormatter;
this.initialize();
return this;
}
public Expression initializerSource_(final Expression _anExpression) {
if (_anExpression == null) {
return NilLiteralNode.factory.basicNew();
}
return this.asLiteralNode_(_anExpression.sourceString());
}
public DiskClassWriter postCopy() {
return this;
}
public Expression referenceAsLiteralNode_(final Reference _aValue) {
if (_aValue == null) {
return NilLiteralNode.factory.basicNew();
}
return StringLiteralNode.factory.value_(_aValue.toString());
}
public java.io.File root() {
return _root;
}
public DiskClassWriter writeClass_in_(final ClassNode _aClassNode, final java.io.File _aFilename) {
final java.io.File _nsFn;
final java.io.File _clFn;
final StringBuilder[] _str;
final VariableNode[] _reader;
_reader = new VariableNode[1];
_str = new StringBuilder[1];
_nsFn = ((java.io.File) st.gravel.support.jvm.ArrayExtensions.inject_into_(_aClassNode.reference().namespace().path(), _aFilename, ((st.gravel.support.jvm.Block2<java.io.File, java.io.File, st.gravel.core.Symbol>) (new st.gravel.support.jvm.Block2<java.io.File, java.io.File, st.gravel.core.Symbol>() {
@Override
public java.io.File value_value_(final java.io.File _fn, final st.gravel.core.Symbol _each) {
return (java.io.File) new java.io.File(_fn, _each.asString());
}
}))));
_nsFn.mkdirs();
_clFn = new java.io.File(_nsFn, _aClassNode.reference().name().asString() + ".st");
_str[0] = st.gravel.support.jvm.WriteStreamFactory.on_(new String());
_reader[0] = VariableNode.factory.name_("reader");
if (_aClassNode.isExtension()) {
DiskClassWriter.this.writeDirective_on_(_reader[0].send_with_(_aClassNode.isTrait() ? "extendTrait:" : "extendClass:", DiskClassWriter.this.asLiteralNode_(_aClassNode.name().asString())), _str[0]);
} else {
DiskClassWriter.this.writeDirective_on_(_reader[0].send_with_with_(_aClassNode.isTrait() ? "defineTrait:superclass:" : "defineClass:superclass:", DiskClassWriter.this.asLiteralNode_(_aClassNode.name().asString()), DiskClassWriter.this.referenceAsLiteralNode_(_aClassNode.superclassReference())), _str[0]);
for (final SharedDeclarationNode _sv : _aClassNode.metaclassNode().sharedVariables()) {
DiskClassWriter.this.writeDirective_on_(_reader[0].send_with_with_("defineSharedVariable:init:", DiskClassWriter.this.asLiteralNode_(_sv.name()), DiskClassWriter.this.initializerSource_(_sv.initializer())), _str[0]);
}
}
for (final Node _each : TraitUsageToDirectiveConverter.factory.visit_(_aClassNode.traitUsage())) {
DiskClassWriter.this.writeDirective_on_(_each, _str[0]);
}
for (final Node _each : ClassTraitUsageToDirectiveConverter.factory.visit_(_aClassNode.metaclassNode().traitUsage())) {
DiskClassWriter.this.writeDirective_on_(_each, _str[0]);
}
for (final VariableDeclarationNode _each : _aClassNode.instVars()) {
if (_each.type() == null) {
DiskClassWriter.this.writeDirective_on_(_reader[0].send_with_("addInstVar:", DiskClassWriter.this.asLiteralNode_(_each.name())), _str[0]);
} else {
DiskClassWriter.this.writeDirective_on_(_reader[0].send_with_with_("addInstVar:type:", DiskClassWriter.this.asLiteralNode_(_each.name()), DiskClassWriter.this.asLiteralNode_(_each.type().sourceString())), _str[0]);
}
}
for (final VariableDeclarationNode _each : _aClassNode.metaclassNode().instVars()) {
if (_each.type() == null) {
DiskClassWriter.this.writeDirective_on_(_reader[0].send_with_("addClassInstVar:", DiskClassWriter.this.asLiteralNode_(_each.name())), _str[0]);
} else {
DiskClassWriter.this.writeDirective_on_(_reader[0].send_with_with_("addClassInstVar:type:", DiskClassWriter.this.asLiteralNode_(_each.name()), DiskClassWriter.this.asLiteralNode_(_each.type().sourceString())), _str[0]);
}
}
for (final Map.Entry<String, String> _temp1 : _aClassNode.properties().entrySet()) {
String _k = _temp1.getKey();
String _v = _temp1.getValue();
DiskClassWriter.this.writeDirective_on_(_reader[0].send_with_with_("propertyAt:put:", DiskClassWriter.this.asLiteralNode_(_k), DiskClassWriter.this.asLiteralNode_(_v)), _str[0]);
}
for (final MethodNode _each : _aClassNode.methods()) {
DiskClassWriter.this.writeDirective_on_(_reader[0].send_with_("addMethod:", DiskClassWriter.this.asLiteralNode_(_each.protocol())), _str[0]);
DiskClassWriter.this.writeMethod_on_(_each, _str[0]);
}
for (final MethodNode _each : _aClassNode.metaclassNode().methods()) {
DiskClassWriter.this.writeDirective_on_(_reader[0].send_with_("addClassMethod:", DiskClassWriter.this.asLiteralNode_(_each.protocol())), _str[0]);
DiskClassWriter.this.writeMethod_on_(_each, _str[0]);
}
st.gravel.support.jvm.StringExtensions.writeToFile_(_str[0].toString(), _clFn);
return this;
}
public DiskClassWriter writeDirective_on_(final Node _aNode, final StringBuilder _aWriteStream) {
_aWriteStream.append(_aNode.sourceString());
_aWriteStream.append('\n');
_aWriteStream.append('!');
_aWriteStream.append('\n');
return this;
}
public DiskClassWriter writeMethod_on_(final Node _aNode, final StringBuilder _aWriteStream) {
String _sourceOrNil;
_sourceOrNil = _aNode.getDiskSource();
if (_sourceOrNil == null) {
_sourceOrNil = _formatter.format_(_aNode);
}
_aWriteStream.append(_sourceOrNil);
_aWriteStream.append('\n');
_aWriteStream.append('!');
_aWriteStream.append('\n');
return this;
}
public DiskClassWriter writeNamespace_in_(final NamespaceNode _aNamespaceNode, final java.io.File _aFilename) {
final java.io.File _nsFn;
final String _json;
final Map<String, Object> _dict;
final String[] _privateImports;
final String[] _publicImports;
final Map<String, String>[] _sharedVariables;
_sharedVariables = new Map[1];
_nsFn = ((java.io.File) st.gravel.support.jvm.ArrayExtensions.inject_into_(_aNamespaceNode.reference().path(), _aFilename, ((st.gravel.support.jvm.Block2<java.io.File, java.io.File, st.gravel.core.Symbol>) (new st.gravel.support.jvm.Block2<java.io.File, java.io.File, st.gravel.core.Symbol>() {
@Override
public java.io.File value_value_(final java.io.File _fn, final st.gravel.core.Symbol _each) {
return (java.io.File) new java.io.File(_fn, _each.asString());
}
}))));
_nsFn.mkdirs();
_dict = new java.util.HashMap<String, Object>();
_privateImports = st.gravel.support.jvm.ArrayExtensions.collect_(_aNamespaceNode.privateImports(), ((st.gravel.support.jvm.Block1<String, AbsoluteReference>) (new st.gravel.support.jvm.Block1<String, AbsoluteReference>() {
@Override
public String value_(final AbsoluteReference _each) {
return (String) _each.toString();
}
})));
_dict.put("privateImports", _privateImports);
_publicImports = st.gravel.support.jvm.ArrayExtensions.collect_(_aNamespaceNode.publicImports(), ((st.gravel.support.jvm.Block1<String, AbsoluteReference>) (new st.gravel.support.jvm.Block1<String, AbsoluteReference>() {
@Override
public String value_(final AbsoluteReference _each) {
return (String) _each.toString();
}
})));
_dict.put("publicImports", _publicImports);
_sharedVariables[0] = new java.util.HashMap<String, String>();
for (final SharedDeclarationNode _each : _aNamespaceNode.sharedVariables()) {
_sharedVariables[0].put(_each.name(), _each.initializer() == null ? null : _each.initializer().sourceString());
}
_dict.put("sharedVariables", _sharedVariables[0]);
_json = st.gravel.support.jvm.DictionaryExtensions.asJSON(_dict);
st.gravel.support.jvm.StringExtensions.writeToFile_(_json, new java.io.File(_nsFn, "properties.json"));
return this;
}
public DiskClassWriter write_(final PackageNode _aPackageNode) {
final java.io.File[] _pkgRoot;
_pkgRoot = new java.io.File[1];
_pkgRoot[0] = new java.io.File(_root, _aPackageNode.name().asString());
_pkgRoot[0].mkdirs();
for (final ClassNode _cl : _aPackageNode.classes()) {
DiskClassWriter.this.writeClass_in_(_cl, _pkgRoot[0]);
}
for (final NamespaceNode _ns : _aPackageNode.namespaces()) {
DiskClassWriter.this.writeNamespace_in_(_ns, _pkgRoot[0]);
}
return this;
}
}