public Context AddDirectory(string baseDir) { Context context = new Context(this); List <DeclaredKontrolModule> declaredModules = new List <DeclaredKontrolModule>(); foreach (string fileName in Directory.GetFiles(baseDir, "*.to2", SearchOption.AllDirectories)) { // First declare the existence of a module and its types TO2Module to2Module = TO2Parser.ParseModuleFile(baseDir, fileName.Remove(0, baseDir.Length + 1)); DeclaredKontrolModule module = ModuleGenerator.DeclareModule(context, to2Module); declaredModules.Add(module); context.registry.RegisterModule(module); } foreach (DeclaredKontrolModule declared in declaredModules) { // ... so that types can be imported by other modules ModuleGenerator.ImportTypes(declared); } foreach (DeclaredKontrolModule declared in declaredModules) { // ... so that function can be declared (potentially using imported types as arguments or return) ModuleGenerator.DeclareFunctions(declared); } foreach (DeclaredKontrolModule declared in declaredModules) { // ... so that other modules may import these functions ModuleGenerator.ImportFunctions(declared); } foreach (DeclaredKontrolModule declared in declaredModules) { // ... so that we should now be able to infer all types ModuleGenerator.VerifyFunctions(declared); } foreach (DeclaredKontrolModule declared in declaredModules) { ModuleGenerator.CompileStructs(declared); } foreach (DeclaredKontrolModule declared in declaredModules) { // ... and eventually emit the code and bake the modules CompiledKontrolModule compiled = ModuleGenerator.CompileModule(declared); context.registry.RegisterModule(compiled); } return(context); }
private static IResult <TO2Module> TryParseModuleFile(string baseDir, string moduleFile) { string content = File.ReadAllText(Path.Combine(baseDir, moduleFile), Encoding.UTF8); IResult <TO2Module> moduleResult = TO2ParserModule.Module(TO2Module.BuildName(moduleFile)).TryParse(content, moduleFile); if (!moduleResult.WasSuccessful) { return(Result.Failure <TO2Module>(moduleResult.Remaining, moduleResult.Expected)); } return(Result.Success(moduleResult.Remaining, moduleResult.Value)); }
public static DeclaredKontrolModule DeclareModule(Context context, TO2Module module) { ModuleContext moduleContext = context.CreateModuleContext(module.name); List <StructuralError> errors = module.TryDeclareTypes(moduleContext); if (errors.Any()) { throw new CompilationErrorException(errors); } return(new DeclaredKontrolModule(module.name, module.description, moduleContext, module, moduleContext.exportedTypes)); }
public Context AddFile(string baseDir, string file) { TO2Module to2Module = TO2Parser.ParseModuleFile(baseDir, file); Context context = new Context(this); DeclaredKontrolModule declaredKontrolModule = ModuleGenerator.DeclareModule(context, to2Module); ModuleGenerator.ImportTypes(declaredKontrolModule); ModuleGenerator.DeclareFunctions(declaredKontrolModule); ModuleGenerator.ImportFunctions(declaredKontrolModule); ModuleGenerator.VerifyFunctions(declaredKontrolModule); CompiledKontrolModule kontrolModule = ModuleGenerator.CompileModule(declaredKontrolModule); RegisterModule(kontrolModule); return(context); }
public void TestBuildModuleName() { Assert.Equal("test_testcontext", TO2Module.BuildName("Test-TestContext.to2")); Assert.Equal("sub::mod::demo", TO2Module.BuildName("sub\\mod\\demo.to2")); Assert.Equal("sub::mod::demo34", TO2Module.BuildName("sub/mod/demo34")); }