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);
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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");
            }
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
 public override void EnterClass_member_declaration([NotNull] CSharpParser.Class_member_declarationContext context)
 {
     //base.EnterClass_member_declaration(context);
 }