private VB6SourceFile ParseCodeFile(string line) { // Seems like only Module & Class contain title: // Module=Module1; Module1.bas // Class=Class1; Class1.cls // Form=Form1.frm // UserControl=UserControl1.ctl // PropertyPage=PropertyPage1.pag var result = new VB6SourceFile(); var data = line.Split('='); switch (data[0]) { case "Module": result.SourceFileType = SourceFileTypeEnum.Module; break; case "Class": result.SourceFileType = SourceFileTypeEnum.Class; break; case "Form": result.SourceFileType = SourceFileTypeEnum.Form; break; case "UserControl": result.SourceFileType = SourceFileTypeEnum.UserControl; break; case "PropertyPage": result.SourceFileType = SourceFileTypeEnum.PropertyPage; break; default: throw new InvalidOperationException($"Unknown project code file type: {line}"); } if ((result.SourceFileType == SourceFileTypeEnum.Module) || (result.SourceFileType == SourceFileTypeEnum.Class)) { var subData = data[1].Split(';'); result.Title = subData[0].Trim(); result.SourceFileName = subData[1].Trim(); } else { result.SourceFileName = data[1].Trim(); } return(result); }
private void ConvertCodeFile(VB6SourceFile vb6File, string vb6CodeFilePath, string vbNetCodeFilePath) { var sr = new StreamReader(vb6CodeFilePath); var source = sr.ReadToEnd(); sr.Close(); sr.Dispose(); var processedCode = PreprocessCodeFile(source); var lineCount = processedCode.Split(new[] { Environment.NewLine }, StringSplitOptions.None).Length; AntlrInputStream inputStream = new AntlrInputStream(processedCode); VisualBasic6Lexer vb6Lexer = new VisualBasic6Lexer(inputStream); CommonTokenStream commonTokenStream = new CommonTokenStream(vb6Lexer); // TokenConstants.HiddenChannel VisualBasic6Parser vb6Parser = new VisualBasic6Parser(commonTokenStream); vb6Parser.AddErrorListener(new VisualBasic6ErrorListener()); // Parse the file. var ctx = vb6Parser.module(); if ((lineCount != vb6Lexer.Line) || (vb6Parser.NumberOfSyntaxErrors > 0)) { throw new Exception($"Total lines: [{lineCount}] Parsed lines: [{vb6Lexer.Line}], NumberOfSyntaxErrors: [{vb6Parser.NumberOfSyntaxErrors}]"); } var codeModelFactory = new VB6ModuleCodeModelFactory(vb6File.SourceFileType, vb6Lexer, vb6Parser, commonTokenStream); var model = codeModelFactory.CreateModuleCodeModels(ctx); // Convert to VB.Net var writer = new VBNetCodeFileWriter(vbNetCodeFilePath); writer.BeginWrite(); model.Convert(writer); writer.EndWrite(); ctx = null; source = null; processedCode = null; inputStream = null; commonTokenStream = null; vb6Lexer = null; vb6Parser = null; }
private VB6SourceFile ParseSourceItem(string name, VB6SourceFileType sourceFileType) { var result = new VB6SourceFile(); // If the name is in two parts split by a semi-colon or comma, that is the name and fileName var parts = name.Split(new[] {";", ","}, StringSplitOptions.RemoveEmptyEntries); result.Type = sourceFileType; switch (parts.Length) { case 1: result.Name = Path.GetFileNameWithoutExtension(parts[0]); result.FileName = parts[0]; break; case 2: result.Name = parts[0]; result.FileName = parts[1]; break; default: throw new ArgumentException("The source item name has too many parts (expecting 1 or 2 parts). Name: " + name, "name"); } return result; }
private void ProcessFile(string vb6ProjectFolder, VBNetProjectFileWriter vbNetWriter, VB6SourceFile codeFile) { var fileToConvert = Path.Combine(vb6ProjectFolder, codeFile.SourceFileName); if (File.Exists(fileToConvert)) { var dotNetFileName = Path.Combine(vbNetWriter.ProjectFolder, Path.GetFileNameWithoutExtension(codeFile.SourceFileName) + ".vb"); ConvertCodeFile(codeFile, fileToConvert, dotNetFileName); } else { throw new Exception($"VB6 code file not found: {codeFile.SourceFileName}"); } }