public override PropertyDefinitionCollection VisitClass_member_declaration(CSharpParser.Class_member_declarationContext context) { var memberDeclaration = context.common_member_declaration()?.typed_member_declaration(); if (memberDeclaration == null) { return(this.Collection); } var modifiers = context.all_member_modifiers()?.all_member_modifier(); if (modifiers == null || modifiers.All(modifier => modifier.Start.Text != "public")) { return(this.Collection); } var property = memberDeclaration.property_declaration(); if (property == null) { return(this.Collection); } var name = property.member_name().Start.Text; var type = memberDeclaration.type(); var argVisitor = new TypeArgumentListVisitor(Cache, Reference); var typeArgs = argVisitor.Visit(type); var classDefinition = new ClassDefinition { BaseName = type.Start.Text, GenericTypeArgs = typeArgs }; var className = classDefinition.Name; if (!Cache.ContainsKey(className)) { Cache.Add(className, classDefinition); } else { classDefinition = Cache[className]; } Reference.Add(className); this.Collection.Add(new PropertyDefinition { Name = name, Type = classDefinition }); return(this.Collection); }
public override void EnterClass_member_declaration(CSharpParser.Class_member_declarationContext context) { var cmdecl = context.common_member_declaration(); if (cmdecl == null) { return; } var nm = GetContextName(cmdecl); var parseItem = new CsharpParseItem { Name = nm }; AssignAccessMods(parseItem, context.all_member_modifiers()); AssignAttributes(parseItem, context.attributes()); AssignParameterType2Names(parseItem, cmdecl);; AssignStartAndStop(parseItem, context); AssignNsAndTypeValues(parseItem); Results.TypeMemberBodies.Add(parseItem); }
public static void Parse(this CSharpParser.Class_member_declarationContext context) { if (context.attributes() != null) { throw new NotImplementedException("Attributes not implemented yet"); } Modifiers modifiers = context.all_member_modifiers() != null?context.all_member_modifiers().Parse() : 0; Console.WriteLine("Modifiers " + modifiers); if (context.destructor_definition() != null) { throw new NotImplementedException("Destructors not implemented yet"); } else if (context.common_member_declaration() != null) { context.common_member_declaration().Parse(); } else { throw new NotSupportedException("Unknown member type"); } }
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); }
public override void EnterClass_member_declaration([NotNull] CSharpParser.Class_member_declarationContext context) { //base.EnterClass_member_declaration(context); }