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.Producer;
import java.util.Map;
import st.gravel.support.compiler.ast.ClassNode;
import st.gravel.support.compiler.ast.MessageNode;
import st.gravel.support.compiler.ast.Parser;
import st.gravel.support.compiler.ast.VariableDeclarationNode;
import st.gravel.support.compiler.ast.SimpleTraitUsageNode;
import st.gravel.support.compiler.ast.Reference;
import st.gravel.support.compiler.ast.Expression;
import st.gravel.support.compiler.ast.SharedDeclarationNode;
import st.gravel.support.compiler.ast.LiteralNode;
import java.util.HashMap;
import st.gravel.support.compiler.ast.SystemDefinitionNode;
import java.util.List;
import st.gravel.support.compiler.ast.PackageNode;
import java.util.ArrayList;
import st.gravel.support.compiler.ast.SourceFile;
import st.gravel.support.compiler.ast.NamespaceNode;
import st.gravel.support.compiler.ast.AbsoluteReference;
import java.util.Map;
import java.util.Map.*;
public class DiskClassReader extends Object implements Cloneable {
public static DiskClassReader_Factory factory = new DiskClassReader_Factory();
Map<String, st.gravel.support.jvm.Block3<ClassNode, ClassNode, MessageNode, Parser>> _directives;
Producer _producer;
java.io.File _root;
public static class DiskClassReader_Factory extends st.gravel.support.jvm.SmalltalkFactory {
public DiskClassReader basicNew() {
DiskClassReader newInstance = new DiskClassReader();
newInstance.initialize();
return newInstance;
}
public DiskClassReader root_producer_(final java.io.File _aFilename, final Producer _aProducer) {
return this.basicNew().initializeRoot_producer_(_aFilename, _aProducer);
}
}
static public DiskClassReader _root_producer_(Object receiver, final java.io.File _aFilename, final Producer _aProducer) {
return factory.root_producer_(_aFilename, _aProducer);
}
public ClassNode addClassInstVar_for_(final String _aString, final ClassNode _aClassNode) {
return _aClassNode.withClassInstVar_(VariableDeclarationNode.factory.name_(_aString));
}
public ClassNode addClassInstVar_type_for_(final String _aString, final String _typeString, final ClassNode _aClassNode) {
return _aClassNode.withClassInstVar_(VariableDeclarationNode.factory.name_type_(_aString, Parser.factory.parseTypeNode_(_typeString)));
}
public ClassNode addClassMethod_for_(final Parser _aParser, final ClassNode _aClassNode) {
return this.addClassMethod_protocol_for_(_aParser, "gravel", _aClassNode);
}
public ClassNode addClassMethod_protocol_for_(final Parser _aParser, final String _aString, final ClassNode _aClassNode) {
_aParser.parseBang();
return _aClassNode.withClassMethodNode_(_aParser.parseMethod().withProtocol_(_aString));
}
public ClassNode addInstVar_for_(final String _aString, final ClassNode _aClassNode) {
return _aClassNode.withInstVar_(VariableDeclarationNode.factory.name_(_aString));
}
public ClassNode addInstVar_type_for_(final String _aString, final String _typeString, final ClassNode _aClassNode) {
return _aClassNode.withInstVar_(VariableDeclarationNode.factory.name_type_(_aString, Parser.factory.parseTypeNode_(_typeString)));
}
public ClassNode addMethod_for_(final Parser _aParser, final ClassNode _aClassNode) {
return this.addMethod_protocol_for_(_aParser, "gravel", _aClassNode);
}
public ClassNode addMethod_protocol_for_(final Parser _aParser, final String _aString, final ClassNode _aClassNode) {
_aParser.parseBang();
return _aClassNode.withMethodNode_(_aParser.parseMethod().withProtocol_(_aString));
}
public ClassNode addSimpleClassTrait_for_(final String _referenceString, final ClassNode _aClassNode) {
return _aClassNode.withClassTrait_(SimpleTraitUsageNode.factory.reference_(Reference.factory.value_(_referenceString)));
}
public ClassNode addSimpleTrait_for_(final String _referenceString, final ClassNode _aClassNode) {
return _aClassNode.withTrait_(SimpleTraitUsageNode.factory.reference_(Reference.factory.value_(_referenceString)));
}
public DiskClassReader copy() {
try {
DiskClassReader _temp1 = (DiskClassReader) this.clone();
_temp1.postCopy();
return _temp1;
} catch (CloneNotSupportedException e) {
throw new RuntimeException(e);
}
}
public ClassNode defineClass_superclass_for_(final String _name, final String _superclassPath, final ClassNode _aClassNode) {
return _aClassNode.withSuperclassPath_(_superclassPath);
}
public ClassNode defineSharedVariable_init_for_(final String _sharedName, final String _initializerSource, final ClassNode _aClassNode) {
final Expression _initializer;
_initializer = this.parseInitializerSource_(_initializerSource);
return _aClassNode.withSharedVariable_(SharedDeclarationNode.factory.name_initializer_(_sharedName, _initializer));
}
public ClassNode defineTrait_superclass_for_(final String _name, final String _superclassPath, final ClassNode _aClassNode) {
return this.defineClass_superclass_for_(_name, _superclassPath, _aClassNode).asTrait();
}
public st.gravel.support.jvm.Block3<ClassNode, ClassNode, MessageNode, Parser> directiveAt_(final String _selector) {
st.gravel.support.jvm.Block3<ClassNode, ClassNode, MessageNode, Parser> _temp1 = _directives.get(_selector);
if (_temp1 == null) {
throw new RuntimeException("Unknown directive: " + _selector);
}
return ((st.gravel.support.jvm.Block3<ClassNode, ClassNode, MessageNode, Parser>) _temp1);
}
public String evaluate_(final LiteralNode _aLiteralNode) {
return ((String) _aLiteralNode.value());
}
public ClassNode extendClass_for_(final String _aString, final ClassNode _aClassNode) {
return _aClassNode.beExtension();
}
public ClassNode extendTrait_for_(final String _aString, final ClassNode _aClassNode) {
return this.extendClass_for_(_aString, _aClassNode).asTrait();
}
public DiskClassReader_Factory factory() {
return factory;
}
public DiskClassReader initialize() {
_directives = new java.util.HashMap<String, st.gravel.support.jvm.Block3<ClassNode, ClassNode, MessageNode, Parser>>();
_directives.put("defineClass:superclass:", new st.gravel.support.jvm.Block3<ClassNode, ClassNode, MessageNode, Parser>() {
@Override
public ClassNode value_value_value_(final ClassNode _classNode, final MessageNode _expr, final Parser _parser) {
return (ClassNode) DiskClassReader.this.defineClass_superclass_for_(DiskClassReader.this.evaluate_(((LiteralNode) (_expr.arguments()[0]))), DiskClassReader.this.evaluate_(((LiteralNode) (_expr.arguments()[1]))), _classNode);
}
});
_directives.put("extendClass:", new st.gravel.support.jvm.Block3<ClassNode, ClassNode, MessageNode, Parser>() {
@Override
public ClassNode value_value_value_(final ClassNode _classNode, final MessageNode _expr, final Parser _parser) {
return (ClassNode) DiskClassReader.this.extendClass_for_(DiskClassReader.this.evaluate_(((LiteralNode) (_expr.arguments()[0]))), _classNode);
}
});
_directives.put("defineTrait:superclass:", new st.gravel.support.jvm.Block3<ClassNode, ClassNode, MessageNode, Parser>() {
@Override
public ClassNode value_value_value_(final ClassNode _classNode, final MessageNode _expr, final Parser _parser) {
return (ClassNode) DiskClassReader.this.defineTrait_superclass_for_(DiskClassReader.this.evaluate_(((LiteralNode) (_expr.arguments()[0]))), DiskClassReader.this.evaluate_(((LiteralNode) (_expr.arguments()[1]))), _classNode);
}
});
_directives.put("extendTrait:", new st.gravel.support.jvm.Block3<ClassNode, ClassNode, MessageNode, Parser>() {
@Override
public ClassNode value_value_value_(final ClassNode _classNode, final MessageNode _expr, final Parser _parser) {
return (ClassNode) DiskClassReader.this.extendTrait_for_(DiskClassReader.this.evaluate_(((LiteralNode) (_expr.arguments()[0]))), _classNode);
}
});
_directives.put("addSimpleTrait:", new st.gravel.support.jvm.Block3<ClassNode, ClassNode, MessageNode, Parser>() {
@Override
public ClassNode value_value_value_(final ClassNode _classNode, final MessageNode _expr, final Parser _parser) {
return (ClassNode) DiskClassReader.this.addSimpleTrait_for_(DiskClassReader.this.evaluate_(((LiteralNode) (_expr.arguments()[0]))), _classNode);
}
});
_directives.put("addSimpleClassTrait:", new st.gravel.support.jvm.Block3<ClassNode, ClassNode, MessageNode, Parser>() {
@Override
public ClassNode value_value_value_(final ClassNode _classNode, final MessageNode _expr, final Parser _parser) {
return (ClassNode) DiskClassReader.this.addSimpleClassTrait_for_(DiskClassReader.this.evaluate_(((LiteralNode) (_expr.arguments()[0]))), _classNode);
}
});
_directives.put("addInstVar:", new st.gravel.support.jvm.Block3<ClassNode, ClassNode, MessageNode, Parser>() {
@Override
public ClassNode value_value_value_(final ClassNode _classNode, final MessageNode _expr, final Parser _parser) {
return (ClassNode) DiskClassReader.this.addInstVar_for_(DiskClassReader.this.evaluate_(((LiteralNode) (_expr.arguments()[0]))), _classNode);
}
});
_directives.put("addInstVar:type:", new st.gravel.support.jvm.Block3<ClassNode, ClassNode, MessageNode, Parser>() {
@Override
public ClassNode value_value_value_(final ClassNode _classNode, final MessageNode _expr, final Parser _parser) {
return (ClassNode) DiskClassReader.this.addInstVar_type_for_(DiskClassReader.this.evaluate_(((LiteralNode) (_expr.arguments()[0]))), DiskClassReader.this.evaluate_(((LiteralNode) (_expr.arguments()[1]))), _classNode);
}
});
_directives.put("addClassInstVar:", new st.gravel.support.jvm.Block3<ClassNode, ClassNode, MessageNode, Parser>() {
@Override
public ClassNode value_value_value_(final ClassNode _classNode, final MessageNode _expr, final Parser _parser) {
return (ClassNode) DiskClassReader.this.addClassInstVar_for_(DiskClassReader.this.evaluate_(((LiteralNode) (_expr.arguments()[0]))), _classNode);
}
});
_directives.put("addClassInstVar:type:", new st.gravel.support.jvm.Block3<ClassNode, ClassNode, MessageNode, Parser>() {
@Override
public ClassNode value_value_value_(final ClassNode _classNode, final MessageNode _expr, final Parser _parser) {
return (ClassNode) DiskClassReader.this.addClassInstVar_type_for_(DiskClassReader.this.evaluate_(((LiteralNode) (_expr.arguments()[0]))), DiskClassReader.this.evaluate_(((LiteralNode) (_expr.arguments()[1]))), _classNode);
}
});
_directives.put("propertyAt:put:", new st.gravel.support.jvm.Block3<ClassNode, ClassNode, MessageNode, Parser>() {
@Override
public ClassNode value_value_value_(final ClassNode _classNode, final MessageNode _expr, final Parser _parser) {
return (ClassNode) DiskClassReader.this.propertyAt_put_for_(DiskClassReader.this.evaluate_(((LiteralNode) (_expr.arguments()[0]))), DiskClassReader.this.evaluate_(((LiteralNode) (_expr.arguments()[1]))), _classNode);
}
});
_directives.put("addMethod", new st.gravel.support.jvm.Block3<ClassNode, ClassNode, MessageNode, Parser>() {
@Override
public ClassNode value_value_value_(final ClassNode _classNode, final MessageNode _expr, final Parser _parser) {
return (ClassNode) DiskClassReader.this.addMethod_for_(_parser, _classNode);
}
});
_directives.put("addClassMethod", new st.gravel.support.jvm.Block3<ClassNode, ClassNode, MessageNode, Parser>() {
@Override
public ClassNode value_value_value_(final ClassNode _classNode, final MessageNode _expr, final Parser _parser) {
return (ClassNode) DiskClassReader.this.addClassMethod_for_(_parser, _classNode);
}
});
_directives.put("addMethod:", new st.gravel.support.jvm.Block3<ClassNode, ClassNode, MessageNode, Parser>() {
@Override
public ClassNode value_value_value_(final ClassNode _classNode, final MessageNode _expr, final Parser _parser) {
return (ClassNode) DiskClassReader.this.addMethod_protocol_for_(_parser, DiskClassReader.this.evaluate_(((LiteralNode) (_expr.arguments()[0]))), _classNode);
}
});
_directives.put("addClassMethod:", new st.gravel.support.jvm.Block3<ClassNode, ClassNode, MessageNode, Parser>() {
@Override
public ClassNode value_value_value_(final ClassNode _classNode, final MessageNode _expr, final Parser _parser) {
return (ClassNode) DiskClassReader.this.addClassMethod_protocol_for_(_parser, DiskClassReader.this.evaluate_(((LiteralNode) (_expr.arguments()[0]))), _classNode);
}
});
_directives.put("defineSharedVariable:init:", new st.gravel.support.jvm.Block3<ClassNode, ClassNode, MessageNode, Parser>() {
@Override
public ClassNode value_value_value_(final ClassNode _classNode, final MessageNode _expr, final Parser _parser) {
return (ClassNode) DiskClassReader.this.defineSharedVariable_init_for_(DiskClassReader.this.evaluate_(((LiteralNode) (_expr.arguments()[0]))), DiskClassReader.this.evaluate_(((LiteralNode) (_expr.arguments()[1]))), _classNode);
}
});
return this;
}
public DiskClassReader initializeRoot_producer_(final java.io.File _aFilename, final Producer _aProducer) {
_root = _aFilename;
_producer = _aProducer;
this.initialize();
return this;
}
public Expression parseInitializerSource_(final String _initializerSource) {
return _initializerSource == null ? null : Parser.factory.parseExpression_(_initializerSource);
}
public DiskClassReader postCopy() {
return this;
}
public Producer producer() {
return _producer;
}
public ClassNode propertyAt_put_for_(final String _key, final String _value, final ClassNode _aClassNode) {
return _aClassNode.withPropertyAt_put_(_key, _value);
}
public SystemDefinitionNode read() {
final List<PackageNode>[] _coll;
_coll = new List[1];
_coll[0] = new java.util.ArrayList();
for (final String _packageName : _root.list()) {
_coll[0].add(DiskClassReader.this.readPackage_(_packageName));
}
return SystemDefinitionNode.factory.packageNodes_(_coll[0].toArray(new PackageNode[_coll[0].size()]));
}
public PackageNode readClassesIn_packageName_namespace_(final java.io.File _fn, final st.gravel.core.Symbol _packageName, final String[] _anArray) {
final PackageNode[] _pkg;
_pkg = new PackageNode[1];
_pkg[0] = PackageNode.factory.name_(_packageName);
for (final String _sf : _fn.list()) {
final java.io.File _subfile;
_subfile = new java.io.File(_fn, _sf);
if (_subfile.isDirectory()) {
_pkg[0] = _pkg[0].withPackage_(DiskClassReader.this.readClassesIn_packageName_namespace_(_subfile, _packageName, st.gravel.support.jvm.ArrayExtensions.copyWith_(_anArray, _sf)));
} else {
if (_sf.endsWith(".st")) {
_pkg[0] = _pkg[0].withClass_(DiskClassReader.this.readClass_packageName_file_namespace_(_sf.substring(0, _sf.length() - ".st".length()), _packageName, _subfile, _anArray));
} else {
if (st.gravel.support.jvm.StringExtensions.equals_(_sf, "properties.json")) {
_pkg[0] = _pkg[0].withNamespace_(DiskClassReader.this.readNamespace_namespace_(_subfile, _anArray));
}
}
}
}
return _pkg[0];
}
public ClassNode readClass_packageName_file_namespace_(final String _aName, final st.gravel.core.Symbol _packageName, final java.io.File _aFilename, final String[] _anArray) {
final Parser _parser;
MessageNode _expr;
ClassNode _cn;
st.gravel.support.jvm.Block3<ClassNode, ClassNode, MessageNode, Parser> _directive;
final int _start;
_cn = ClassNode.factory.name_namespacePath_(st.gravel.core.Symbol.value(_aName), st.gravel.support.jvm.ArrayExtensions.collect_(_anArray, ((st.gravel.support.jvm.Block1<st.gravel.core.Symbol, String>) (new st.gravel.support.jvm.Block1<st.gravel.core.Symbol, String>() {
@Override
public st.gravel.core.Symbol value_(final String _each) {
return (st.gravel.core.Symbol) st.gravel.core.Symbol.value(_each);
}
}))));
_parser = Parser.factory.source_sourceFile_(st.gravel.support.jvm.FilenameExtensions.contentsOfEntireFile(_aFilename), SourceFile.factory.directory_name_packageName_(_aFilename.getParent(), _aFilename.getName(), _packageName));
_start = _parser.position();
boolean _temp1 = false;
while (!_temp1) {
_temp1 = _parser.atEnd();
if (!_temp1) {
_expr = ((MessageNode) _parser.parseExpression());
_directive = DiskClassReader.this.directiveAt_(_expr.selector());
_cn = _directive.value_value_value_(_cn, _expr, _parser);
if (!_parser.atEnd()) {
_parser.parseBang();
}
}
}
return ((ClassNode) _parser.setSourcePosition_node_(_start, _cn));
}
public NamespaceNode readNamespace_namespace_(final java.io.File _aFilename, final String[] _namespaceStrings) {
final Map<String, Object> _dict;
final AbsoluteReference[] _publicImports;
final AbsoluteReference[] _privateImports;
final Object[] _publicImportStrings;
final Object[] _privateImportStrings;
final Map<String, String> _sharedVariableStrings;
final List<SharedDeclarationNode>[] _sharedVariables;
_sharedVariables = new List[1];
_dict = this.readPropertiesFile_(_aFilename);
Object _temp1 = _dict.get("publicImports");
if (_temp1 == null) {
_temp1 = new Object[] {};
}
_publicImportStrings = ((Object[]) _temp1);
Object _temp2 = _dict.get("privateImports");
if (_temp2 == null) {
_temp2 = new Object[] {};
}
_privateImportStrings = ((Object[]) _temp2);
Object _temp3 = _dict.get("sharedVariables");
if (_temp3 == null) {
_temp3 = new java.util.HashMap<String, String>();
}
_sharedVariableStrings = ((Map<String, String>) _temp3);
_publicImports = st.gravel.support.jvm.ArrayExtensions.collect_(_publicImportStrings, ((st.gravel.support.jvm.Block1<AbsoluteReference, Object>) (new st.gravel.support.jvm.Block1<AbsoluteReference, Object>() {
@Override
public AbsoluteReference value_(final Object _obj) {
final String _str;
_str = ((String) _obj);
return (AbsoluteReference) Reference.factory.value_(_str);
}
})));
_privateImports = st.gravel.support.jvm.ArrayExtensions.collect_(_privateImportStrings, ((st.gravel.support.jvm.Block1<AbsoluteReference, Object>) (new st.gravel.support.jvm.Block1<AbsoluteReference, Object>() {
@Override
public AbsoluteReference value_(final Object _obj) {
final String _str;
_str = ((String) _obj);
return (AbsoluteReference) Reference.factory.value_(_str);
}
})));
_sharedVariables[0] = new java.util.ArrayList();
for (final Map.Entry<String, String> _temp4 : _sharedVariableStrings.entrySet()) {
String _name = _temp4.getKey();
String _initializerString = _temp4.getValue();
_sharedVariables[0].add(SharedDeclarationNode.factory.name_initializer_(_name, DiskClassReader.this.parseInitializerSource_(_initializerString)));
}
return NamespaceNode.factory.reference_publicImports_privateImports_sharedVariables_(AbsoluteReference.factory.path_(st.gravel.support.jvm.ArrayExtensions.collect_(_namespaceStrings, ((st.gravel.support.jvm.Block1<st.gravel.core.Symbol, String>) (new st.gravel.support.jvm.Block1<st.gravel.core.Symbol, String>() {
@Override
public st.gravel.core.Symbol value_(final String _each) {
return (st.gravel.core.Symbol) st.gravel.core.Symbol.value(_each);
}
})))), _publicImports, _privateImports, _sharedVariables[0].toArray(new SharedDeclarationNode[_sharedVariables[0].size()]));
}
public PackageNode readPackage_(final String _aString) {
return this.readClassesIn_packageName_namespace_(new java.io.File(_root, _aString), st.gravel.core.Symbol.value(_aString), new String[] {});
}
public Map<String, Object> readPropertiesFile_(final java.io.File _aFilename) {
if (!_aFilename.exists()) {
return new java.util.HashMap<String, Object>();
}
return st.gravel.support.jvm.StringExtensions.parseAsJSONValue(st.gravel.support.jvm.FilenameExtensions.contentsOfEntireFile(_aFilename));
}
public java.io.File root() {
return _root;
}
}