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