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);
        }
Esempio n. 2
0
        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;
        }
Esempio n. 3
0
        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;
        }
Esempio n. 4
0
        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}");
            }
        }