// add parentheses to calls that do not have them public override void EnterICS_B_MemberProcedureCall([NotNull] VBAParser.ICS_B_MemberProcedureCallContext context) { if (!context.argsCall().IsEmpty) { Rewriter.InsertBefore(context.argsCall().Start, "("); Rewriter.InsertAfter(context.argsCall().Stop, ")"); } }
// we add initialization Sub for the current Structure public override void ExitTypeStmt([NotNull] VBAParser.TypeStmtContext context) { var currentType = Types.Pop(); if (InitStructures.ContainsKey(currentType) && InitStructures[currentType].Text.Length > 0) { Rewriter.InsertBefore(context.Stop, InitStructures[currentType].Text); StructuresWithInitializer.Add(currentType); } else { InitStructures.Remove(currentType); } }
// transform a Type in a Structure public override void EnterTypeStmt(VBAParser.TypeStmtContext context) { var typeName = context.ambiguousIdentifier().GetText(); Types.Push(typeName); InitStructures.Add(typeName, new StructureInitializer(typeName)); Rewriter.Replace(context.TYPE().Symbol, "Structure"); Rewriter.Replace(context.END_TYPE().Symbol, "End Structure"); string visibility = context.visibility().GetText(); foreach (var st in context.typeStmt_Element()) { Rewriter.InsertBefore(st.Start, $"{visibility} "); } }
// wrap the VBA code with a Module public override void ExitStartRule(VBAParser.StartRuleContext context) { // if an option is present it must before everything else // therefore we have to check where to put the module start var baseText = $"Imports System {Environment.NewLine}{Environment.NewLine}Imports Microsoft.VisualBasic{Environment.NewLine}Imports System.Math{Environment.NewLine}Imports System.Linq{Environment.NewLine}Imports System.Collections.Generic{Environment.NewLine}{Environment.NewLine}Module {FileName}{Environment.NewLine}"; if (TokenImport != null) { // add imports and module Rewriter.InsertAfter(TokenImport, $"{Environment.NewLine}{baseText}"); } else { // add imports and module Rewriter.InsertBefore(context.Start, baseText); } Rewriter.InsertAfter(context.Stop.StopIndex, $"{Environment.NewLine}End Module"); }
// we search for the Main Sub public override void EnterSubStmt([NotNull] VBAParser.SubStmtContext context) { if (context.ambiguousIdentifier().GetText().Trim() == "Main_Run" || context.ambiguousIdentifier().GetText().Trim() == "Main_Sub" || context.ambiguousIdentifier().GetText().Trim() == "Main") { MainFile = true; Rewriter.Replace(context.ambiguousIdentifier().Start, "Main"); // Some function of VB.Net are culture-aware, // this means, for instance, that when parsing a double from a // string it searchs for the proper-culture decimal separator (e.g, ',' or '.'). So, we set a culture that ensure // that VB.Net uses a decimal separator '.' Rewriter.InsertBefore(context.block().Start, $"{Environment.NewLine}Dim sw As System.Diagnostics.Stopwatch = System.Diagnostics.Stopwatch.StartNew(){Environment.NewLine}"); Rewriter.InsertBefore(context.block().Start, $"{Environment.NewLine}System.Globalization.CultureInfo.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture{Environment.NewLine}"); // make the program wait at the end Rewriter.InsertBefore(context.block().Stop, $"{Environment.NewLine}Console.WriteLine(\"Press any key to exit the program\"){Environment.NewLine}Console.ReadKey(){Environment.NewLine}"); Rewriter.InsertBefore(context.block().Stop, $"{Environment.NewLine}sw.Stop(){Environment.NewLine}Console.WriteLine($\"Time elapsed {{sw.Elapsed}}\"){Environment.NewLine}"); } }
public override object VisitConstructor_declaration( [NotNull] CSharpParser.Constructor_declarationContext context) { if (GetCurrentNamespace() == _breadcrumbNamespace && GetCurrentClass() == _breadcrumbDeclaration.Identifier) { _hasBreadcrumbConstructor = true; var preCtorWhitespace = Tokens.GetHiddenTokensToLeft(context.Start.TokenIndex, Lexer.Hidden); int tabLevels = 1 + ((preCtorWhitespace?.Count ?? 0) > 0 ? _stringUtilService.CalculateTabLevels(preCtorWhitespace[0]?.Text ?? string.Empty, _tabString) : 0); var fixedParams = context?.constructor_declarator()?.formal_parameter_list()?.fixed_parameters() ?.fixed_parameter(); if (fixedParams != null) { foreach (var fixedParam in fixedParams) { var paramName = $"{fixedParam.type_().GetText()} {fixedParam.identifier().GetText()}"; if (_ctorParamDict.ContainsKey(paramName)) { _ctorParamDict.Remove(paramName); } } } var ctorStatements = context?.constructor_body()?.block()?.statement_list(); if (ctorStatements != null) { foreach (var statement in ctorStatements.statement()) { var minStatement = _cSharpParserService.GetTextWithWhitespaceMinified(Tokens, statement); if (_ctorAssignmentDict.ContainsKey(minStatement)) { _ctorAssignmentDict.Remove(minStatement); } } } if (_ctorParamDict.Keys.Count > 0) { // add params var ctorParams = _ctorParamDict.Values.ToList(); var formalParamList = context?.constructor_declarator()?.formal_parameter_list(); var finalFixedParam = context?.constructor_declarator() ?.formal_parameter_list() ?.fixed_parameters() ?.fixed_parameter() ?.Last(); int fixedParamStopIndex = finalFixedParam?.Stop?.TokenIndex ?? context.constructor_declarator().OPEN_PARENS().Symbol.TokenIndex; var paramStringBuilder = new StringBuilder(); if (finalFixedParam != null) { var preFinalParamWhitespace = Tokens.GetHiddenTokensToLeft( finalFixedParam?.Start?.TokenIndex ?? -1, Lexer.Hidden); int finalParamtabs = (preFinalParamWhitespace?.Count ?? 0) > 0 ? _stringUtilService.CalculateTabLevels(preFinalParamWhitespace[0]?.Text ?? string.Empty, _tabString) : 0; if (finalParamtabs > 0) { paramStringBuilder.Append(_cSharpParserService.GenerateFixedParameters( ctorParams, tabLevels, _tabString)); if (formalParamList?.parameter_array() != null) { var preParamArrayWhitespaceArray = Tokens.GetHiddenTokensToLeft( formalParamList.parameter_array().Start.TokenIndex, Lexer.Hidden); string preParamArrayWhitespace = preParamArrayWhitespaceArray.Count > 0 ? preParamArrayWhitespaceArray[0].Text : string.Empty; if (!Regex.IsMatch(preParamArrayWhitespace, @"\r?\n")) { IsModified = true; Rewriter.InsertBefore( formalParamList.parameter_array().Start.TokenIndex, "\r\n" + _stringUtilService.TabString(string.Empty, finalParamtabs, _tabString)); } } } else { paramStringBuilder.Append(_cSharpParserService.GenerateFixedParameters( ctorParams, tabLevels, _tabString, false, true)); } } else { paramStringBuilder.Append(_cSharpParserService.GenerateFixedParameters( ctorParams, tabLevels, _tabString, true)); if (formalParamList?.parameter_array() != null) { var preParamArrayWhitespaceArray = Tokens.GetHiddenTokensToLeft( formalParamList.parameter_array().Start.TokenIndex, Lexer.Hidden); string preParamArrayWhitespace = preParamArrayWhitespaceArray.Count > 0 ? preParamArrayWhitespaceArray[0].Text : string.Empty; if (!Regex.IsMatch(preParamArrayWhitespace, $"\r?\n")) { IsModified = true; Rewriter.InsertBefore( formalParamList.parameter_array().Start.TokenIndex, "\r\n" + _stringUtilService.TabString(string.Empty, tabLevels, _tabString)); } } } var paramString = paramStringBuilder.ToString(); if (paramString.Length > 0) { IsModified = true; Rewriter.InsertAfter(fixedParamStopIndex, paramString); } } if (_ctorAssignmentDict.Keys.Count > 0) { var ctorAssignments = _ctorAssignmentDict.Values.ToList(); var assignmentsString = _cSharpParserService.GenerateSimpleAssignments( ctorAssignments, tabLevels, _tabString); var constructorBody = context?.constructor_body(); if (constructorBody.SEMICOLON() != null) { var conBodyBuilder = new StringBuilder(); conBodyBuilder.Append("\r\n"); conBodyBuilder.Append(_stringUtilService.TabString("{", tabLevels - 1, _tabString)); conBodyBuilder.Append(assignmentsString); conBodyBuilder.Append("\r\n"); conBodyBuilder.Append(_stringUtilService.TabString("}", tabLevels - 1, _tabString)); IsModified = true; Rewriter.Replace(constructorBody.SEMICOLON().Symbol.TokenIndex, conBodyBuilder.ToString()); } else { var block = constructorBody.block(); int?finalAssignment = block.statement_list()?.statement()?.Last()?.Stop?.TokenIndex; int assignmentStopIndex = finalAssignment ?? block.OPEN_BRACE().Symbol.TokenIndex; var assignmentStringBuilder = new StringBuilder(); assignmentStringBuilder.Append(assignmentsString); var postAssignmentStopWhitespaceArray = Tokens.GetHiddenTokensToRight( assignmentStopIndex, Lexer.Hidden); string postAssignmentStopWhitespace = postAssignmentStopWhitespaceArray.Count > 0 ? postAssignmentStopWhitespaceArray[0].Text : string.Empty; if (!Regex.IsMatch(postAssignmentStopWhitespace, @"\r?\n")) { assignmentStringBuilder.Append("\r\n"); } var assignmentString = assignmentStringBuilder.ToString(); if (assignmentString.Length > 0) { IsModified = true; Rewriter.InsertAfter(assignmentStopIndex, assignmentString); } } } } VisitChildren(context); return(null); }
public override object VisitClass_declaration([NotNull] CSharpParser.Class_declarationContext context) { var currentNamespace = string.Join(".", _currentNamespace.ToArray().Reverse()); if (context.identifier().GetText() == _constructorClassName && currentNamespace == _constructorClassNamespace) { _isConstructorClassFound = true; var preclassWhitespace = Tokens.GetHiddenTokensToLeft(context.Start.TokenIndex, Lexer.Hidden); int classBodyTabLevels = 1 + ((preclassWhitespace?.Count ?? 0) > 0 ? _stringUtilService.CalculateTabLevels(preclassWhitespace[0]?.Text ?? string.Empty, _tabString) : 0); int ctorBodyTabLevels = classBodyTabLevels + 1; int?finalConstantOrField = null; int?finalField = null; int?finalProperty = null; CSharpParser.Constructor_declarationContext constructorContext = null; bool hasServiceField = false; bool hasCtorParam = false; bool hasCtorAssignment = false; var members = context?.class_body()?.class_member_declarations()?.class_member_declaration(); if (members != null) { foreach (var member in members) { if (member.constant_declaration() != null) { finalConstantOrField = member.constant_declaration().Stop.TokenIndex; } else if (member.field_declaration() != null) { var fieldDec = member.field_declaration(); finalField = fieldDec.Stop.TokenIndex; finalConstantOrField = fieldDec.Stop.TokenIndex; if (fieldDec.type_().GetText() == _serviceInterfaceType) { foreach (var varDec in fieldDec.variable_declarators().variable_declarator()) { if (varDec.identifier().GetText() == $"_{_serviceIdentifier}") { hasServiceField = true; break; } } } } else if (member.property_declaration() != null) { finalProperty = member.property_declaration().Stop.TokenIndex; } else if (member.constructor_declaration() != null) { constructorContext ??= member.constructor_declaration(); } } } int fieldStopIndex = finalField ?? finalConstantOrField ?? context.class_body().OPEN_BRACE().Symbol.TokenIndex; int?constructorStopIndex = null; var fieldStringBuilder = new StringBuilder(); StringBuilder constructorStringBuilder = null; if (!hasServiceField) { fieldStringBuilder.Append(_cSharpParserService.GenerateFieldDeclaration( _fieldDeclaration, classBodyTabLevels, _tabString)); } if (constructorContext is null) { constructorStopIndex = finalProperty ?? finalConstantOrField ?? fieldStopIndex; constructorStringBuilder = constructorStopIndex == fieldStopIndex ? fieldStringBuilder : new StringBuilder(); constructorStringBuilder.Append( _cSharpParserService.GenerateConstructorDeclaration( _constructorDeclaration, classBodyTabLevels, _tabString)); } else { CSharpParser.Fixed_parameterContext finalFixedParam = null; var formalParamList = constructorContext?.constructor_declarator()?.formal_parameter_list(); if (formalParamList != null) { var fixedParams = formalParamList.fixed_parameters(); if (fixedParams != null) { foreach (var fixedParam in fixedParams.fixed_parameter()) { if (fixedParam.type_().GetText() == _serviceInterfaceType && fixedParam.identifier().GetText() == _serviceIdentifier) { hasCtorParam = true; break; } } finalFixedParam = fixedParams.fixed_parameter().Last(); } } if (!hasCtorParam) { var ctorParam = _cSharpCommonStgService.RenderFixedParameter(_constructorParameter); int fixedParamStopIndex = finalFixedParam?.Stop?.TokenIndex ?? constructorContext.constructor_declarator().OPEN_PARENS().Symbol.TokenIndex; var paramStringBuilder = new StringBuilder(); if (finalFixedParam != null) { var preFinalParamWhitespace = Tokens.GetHiddenTokensToLeft( finalFixedParam?.Start?.TokenIndex ?? -1, Lexer.Hidden); int finalParamtabs = (preFinalParamWhitespace?.Count ?? 0) > 0 ? _stringUtilService.CalculateTabLevels( preFinalParamWhitespace?[0]?.Text ?? string.Empty, _tabString) : 0; if (finalParamtabs > 0) { paramStringBuilder.Append(",\r\n"); paramStringBuilder.Append(_stringUtilService.TabString( ctorParam, finalParamtabs, _tabString)); if (formalParamList?.parameter_array() != null) { var preParamArrayWhitespaceArray = Tokens.GetHiddenTokensToLeft( formalParamList.parameter_array().Start.TokenIndex, Lexer.Hidden); string preParamArrayWhitespace = preParamArrayWhitespaceArray.Count > 0 ? preParamArrayWhitespaceArray[0].Text : string.Empty; if (!Regex.IsMatch(preParamArrayWhitespace, @"\r?\n")) { _isRewritten = true; Rewriter.InsertBefore( formalParamList.parameter_array().Start.TokenIndex, "\r\n" + _stringUtilService.TabString(string.Empty, finalParamtabs, _tabString)); } } } else { paramStringBuilder.Append(", "); paramStringBuilder.Append(ctorParam); } } else { paramStringBuilder.Append("\r\n"); paramStringBuilder.Append( _stringUtilService.TabString(ctorParam, ctorBodyTabLevels, _tabString)); if (formalParamList?.parameter_array() != null) { var preParamArrayWhitespaceArray = Tokens.GetHiddenTokensToLeft( formalParamList.parameter_array().Start.TokenIndex, Lexer.Hidden); string preParamArrayWhitespace = preParamArrayWhitespaceArray.Count > 0 ? preParamArrayWhitespaceArray[0].Text : string.Empty; if (!Regex.IsMatch(preParamArrayWhitespace, $"\r?\n")) { _isRewritten = true; Rewriter.InsertBefore( formalParamList.parameter_array().Start.TokenIndex, "\r\n" + _stringUtilService.TabString(string.Empty, ctorBodyTabLevels, _tabString)); } } } var paramString = paramStringBuilder.ToString(); if (paramString.Length > 0) { _isRewritten = true; Rewriter.InsertAfter(fixedParamStopIndex, paramString); } } string ctorAssignString = _cSharpCommonStgService.RenderSimpleAssignment(_constructorAssignment); var constructorBody = constructorContext?.constructor_body(); if (constructorBody.SEMICOLON() != null) { _isRewritten = true; Rewriter.Replace(constructorBody.SEMICOLON().Symbol.TokenIndex, _stringUtilService.TabString( $@"\r\n{{\r\n{_tabString}{ctorAssignString}\r\n}}", classBodyTabLevels, _tabString)); } else { var block = constructorBody.block(); var statementList = block?.statement_list()?.GetText(); if (statementList != null) { var assignmentMatchString = $@"[\s;{{]_{_serviceIdentifier}\s*=\s*{_serviceIdentifier}\s*;"; hasCtorAssignment = Regex.Match(statementList, assignmentMatchString).Success; } if (!hasCtorAssignment) { int?finalAssignment = block.statement_list().statement().Last().Stop.TokenIndex; int assignmentStopIndex = finalAssignment ?? block.OPEN_BRACE().Symbol.TokenIndex; var assignmentStringBuilder = new StringBuilder(); assignmentStringBuilder.Append("\r\n"); assignmentStringBuilder.Append(_stringUtilService.TabString( ctorAssignString, ctorBodyTabLevels, _tabString)); var postAssignmentStopWhitespaceArray = Tokens.GetHiddenTokensToRight( assignmentStopIndex, Lexer.Hidden); string postAssignmentStopWhitespace = postAssignmentStopWhitespaceArray.Count > 0 ? postAssignmentStopWhitespaceArray[0].Text : string.Empty; if (!Regex.IsMatch(postAssignmentStopWhitespace, @"\r?\n")) { assignmentStringBuilder.Append("\r\n"); } var assignmentString = assignmentStringBuilder.ToString(); if (assignmentString.Length > 0) { _isRewritten = true; Rewriter.InsertAfter(assignmentStopIndex, assignmentString); } } } } var fieldString = fieldStringBuilder.ToString(); if (fieldString.Length > 0) { _isRewritten = true; Rewriter.InsertAfter(fieldStopIndex, fieldString); } if (constructorStringBuilder != null && constructorStopIndex != fieldStopIndex) { var constructorString = constructorStringBuilder.ToString(); if (constructorString.Length > 0) { _isRewritten = true; Rewriter.InsertAfter(Tokens.Get(constructorStopIndex ?? -1), constructorString); } } } VisitChildren(context); return(null); }
public override object VisitClass_member_declaration([NotNull] CSharpParser.Class_member_declarationContext context) { var method = context?.method_declaration(); // Find method "public void ConfigureServices(IServiceCollection services)" if (method != null && method.method_header().member_name().identifier().GetText() == "ConfigureServices" && string.Join(".", _currentClass.ToArray().Reverse()) == "Startup" && string.Join(".", _currentNamespace.ToArray().Reverse()) == _rootNamespace ) { _isFoundConfigureServices = true; var paramList = method?.method_header()?.formal_parameter_list()?.fixed_parameters()?.fixed_parameter(); if (paramList is null) { // throw } // Get name of IServiceCollection parameter (services) string serviceCollectionName = null; foreach (var param in paramList) { if (param.type_().GetText() == nameof(IServiceCollection)) { serviceCollectionName = param.identifier().GetText(); break; } } if (serviceCollectionName is null) { // throw } // Check each services.Add[Lifespan] method in the form // If TypeParameters: services.AddScoped(typeof(IMyService<>), typeof(MyService<>)); // Else: services.AddScoped<IMyService, MyService>(); // If found and Lifespan in services.Add[Lifespan] == Service.Lifespan: // No action taken // Else if found and Lifespan in services.Add[Lifespan] != Service.Lifespan: // Replace Add[Lifespan] with Add[Service.Lifespan] in token stream // Else: // Create StringTemplate for services.Add[Lifespan] statement // If TypeParameters: services.AddScoped(typeof(IMyService<>), typeof(MyService<>)); // Else: services.AddScoped<IMyService, MyService>(); // Use rewriter to insert services.Add[Lifespan] into token stream // Write parse tree as string to Startup.cs var missingRegInfo = new List <StartupRegistrationInfo>(); var body = _cSharpParserService.GetTextWithWhitespace(Tokens, method.method_body()); foreach (var regInfo in _startupRegInfoList) { if (!Regex.Match(body, ServiceRegistrationMatchString(regInfo)).Success) { missingRegInfo.Add(regInfo); } } if (missingRegInfo.Count > 0) { if (method?.method_body()?.block() is null) { // throw } else { var closeBranceIndex = method.method_body().block().CLOSE_BRACE().Symbol.TokenIndex; var preclassWhitespace = Tokens.GetHiddenTokensToLeft(closeBranceIndex, Lexer.Hidden); int tabLevels = (preclassWhitespace?.Count ?? 0) > 0 ? _stringUtilService.CalculateTabLevels(preclassWhitespace[0]?.Text ?? string.Empty, _tabString) : 0; var regCallStrings = new List <string>(); foreach (var regInfo in missingRegInfo) { var regCallString = _serviceCommandStgService.RenderServiceStartupRegistrationCall( serviceClassType: regInfo.ServiceClassType, serviceBaseType: regInfo.ServiceBaseType, hasTypeParameters: regInfo.HasTypeParameters, serviceLifespan: regInfo.ServiceLifespan.ToString()); regCallStrings.Add(serviceCollectionName + regCallString + ";"); } var registrationStatement = "\r\n" + _stringUtilService.TabString( string.Join("\r\n", regCallStrings), tabLevels + 1, _tabString) + "\r\n" + _stringUtilService.TabString(string.Empty, tabLevels, _tabString); IsModified = true; Rewriter.InsertBefore(closeBranceIndex, registrationStatement); return(null); } } } VisitChildren(context); return(null); }