public IEnumerable <Dictionary <string, string> > ExecuteMacro(string param, ICsharpMacroContext context)
        {
            var matchedRange = rangePattern.Match(param);

            if (matchedRange.Success)
            {
                var from = int.Parse(matchedRange.Groups["from"].Value);
                var to   = int.Parse(matchedRange.Groups["to"].Value);
                var step = 1;
                if (matchedRange.Groups["step"].Success)
                {
                    step = Math.Max(int.Parse(matchedRange.Groups["step"].Value), 1);
                    if (from > to)
                    {
                        to = from;
                    }
                }

                for (int i = from; i <= to; i += step)
                {
                    yield return(new Dictionary <string, string>()
                    {
                        ["index"] = i.ToString(),
                        ["from"] = from.ToString(),
                        ["to"] = to.ToString(),
                        ["step"] = step.ToString()
                    });
                }
            }
        }
Example #2
0
        public static TypeInfo GetTypeInfo(string typeName, ICsharpMacroContext context)
        {
            var typeInfo = GetTypeInfo(typeName);

            typeInfo.Symbol = FindMatchingSymbol(context, typeInfo);
            return(typeInfo);
        }
        public IEnumerable <Dictionary <string, string> > ExecuteMacro(string param, ICsharpMacroContext context)
        {
            var typeInfo = TypeHelper.GetTypeInfo(param, context);

            foreach (var member in typeInfo.SelectAllMembers <IMethodSymbol>().Where(x => x.MethodKind == MethodKind.Ordinary))
            {
                var(returnTypeShorty, returnTypeLong) = typeInfo.GetMemberType(member.ReturnType);
                var attributes = new Dictionary <string, string>()
                {
                    ["name"]              = member.Name,
                    ["returnType"]        = returnTypeShorty,
                    ["returnTypeLong"]    = returnTypeLong,
                    ["signature"]         = GetSignature(member, context),
                    ["returnOperator"]    = GetReturnOperator(returnTypeShorty),
                    ["parameters"]        = GetParametersString(member),
                    ["genericParameters"] = GetGenericParametersString(member)
                };

                int parameterIndex = 1;
                foreach (var parameter in member.Parameters)
                {
                    var(paramTypeShort, paramTypeLong) = typeInfo.GetMemberType(parameter.Type);
                    attributes.Add($"paramName{parameterIndex}", parameter.Name);
                    attributes.Add($"paramType{parameterIndex}", paramTypeShort);
                    attributes.Add($"paramTypeLong{parameterIndex}", paramTypeLong);
                    parameterIndex++;
                }
                yield return(attributes);
            }
        }
Example #4
0
        public IEnumerable <Dictionary <string, string> > ExecuteMacro(string param, ICsharpMacroContext context)
        {
            var tupleMatches = tuplePattern.Matches(param);

            if (tupleMatches.Count > 0)
            {
                return(tupleMatches.OfType <Match>().Select(m => GetAttributesForTuple(m.Groups[1].Value)));
            }

            return(GetAttributesForSingleValue(param));
        }
        public IEnumerable <Dictionary <string, string> > ExecuteMacro(string param, ICsharpMacroContext context)
        {
            var typeInfo = TypeHelper.GetTypeInfo(param, context);
            var derived  = SymbolFinder.FindDerivedClassesAsync(typeInfo.Symbol, context.Solution).GetAwaiter().GetResult();

            foreach (var derivedType in derived)
            {
                yield return(new Dictionary <string, string>()
                {
                    ["name"] = derivedType.GetFullGenericName(),
                    ["based"] = typeInfo.Symbol.Name
                });
            }
        }
Example #6
0
        public IEnumerable <Dictionary <string, string> > ExecuteMacro(string param, ICsharpMacroContext context)
        {
            var typeInfo = TypeHelper.GetTypeInfo(param, context);

            foreach (var member in typeInfo.SelectAllMembers <IPropertySymbol>())
            {
                var(typeNameShort, typeNameLong) = typeInfo.GetMemberType(member.Type);
                yield return(new Dictionary <string, string>()
                {
                    ["name"] = member.Name,
                    ["type"] = typeNameShort,
                    ["typeLong"] = typeNameLong
                });
            }
        }
        public IEnumerable <Dictionary <string, string> > ExecuteMacro(string param, ICsharpMacroContext context)
        {
            var typeInfo        = TypeHelper.GetTypeInfo(param, context);
            var implementations = SymbolFinder.FindImplementationsAsync(typeInfo.Symbol, context.Solution).GetAwaiter().GetResult();

            foreach (var implementation in implementations.OrderBy(x => x.Name).OfType <INamedTypeSymbol>())
            {
                var allInterfaces = TypeHelper.GetBaseTypesAndThis(implementation).SelectMany(x => x.Interfaces);

                yield return(new Dictionary <string, string>()
                {
                    ["name"] = implementation.GetFullGenericName(),
                    ["interface"] = TypeHelper.FindMatchingSymbol(allInterfaces, typeInfo)?.GetFullGenericName() ?? typeInfo.Name
                });
            }
        }
        private static string GetSignature(IMethodSymbol member, ICsharpMacroContext context)
        {
            string PresentSymbol(ISymbol typeSymbol)
            {
                return(typeSymbol.ToMinimalDisplayString(context.SemanticModel, context.MacroLocation.SourceSpan.Start));
            }

            var parameters = string.Join(", ", member.Parameters.Select(x => $"{PresentSymbol(x)}".Trim()));


            if (member.IsGenericMethod)
            {
                var genericParameters = GetGenericParametersString(member);
                return($"{PresentSymbol(member.ReturnType)} {member.Name}{genericParameters}({parameters})");
            }
            return($"{PresentSymbol(member.ReturnType)} {member.Name}({parameters})");
        }
Example #9
0
        public IEnumerable <Dictionary <string, string> > ExecuteMacro(string param, ICsharpMacroContext context)
        {
            var typeInfo = TypeHelper.GetTypeInfo(param, context);

            if (typeInfo.Symbol is { } symbol&& symbol.TypeKind == TypeKind.Enum)
            {
                foreach (var member in symbol.GetMembers())
                {
                    if (member.Kind == SymbolKind.Field)
                    {
                        yield return(new Dictionary <string, string>()
                        {
                            ["name"] = member.Name
                        });
                    }
                }
            }
        }
Example #10
0
        private static List <INamedTypeSymbol> FindSymbolCandidates(ICsharpMacroContext context, TypeInfo typeInfo)
        {
            var namedCandidates = context.SemanticModel.Compilation.GetSymbolsWithName(typeInfo.Name)
                                  .OfType <INamedTypeSymbol>()
                                  .ToList();

            if (namedCandidates.Count != 0)
            {
                return(namedCandidates);
            }

            var symbol = context.SemanticModel.Compilation.GetTypeByMetadataName(typeInfo.FullName);

            if (symbol != null)
            {
                return(new List <INamedTypeSymbol>()
                {
                    symbol
                });
            }

            return(new List <INamedTypeSymbol>());
        }
Example #11
0
        private static string TransformContent(ICsharpMacro macro, MacroDescriptor macroDescriptor, ICsharpMacroContext macroContext)
        {
            var sb = new StringBuilder();

            foreach (var attributes in macro.ExecuteMacro(macroDescriptor.Param, macroContext))
            {
                var transformedItem = TransformedTemplate(macroDescriptor.Template, attributes);
                sb.Append(transformedItem);
            }
            return(sb.ToString().Replace("//", ""));
        }
Example #12
0
        private static INamedTypeSymbol FindMatchingSymbol(ICsharpMacroContext context, TypeInfo typeInfo)
        {
            var namedCandidates = FindSymbolCandidates(context, typeInfo);

            return(FindMatchingSymbol(namedCandidates, typeInfo));
        }