コード例 #1
0
        public static ArgumentListSyntax GetParentInvocationArguments(
            this MemberAccessExpressionSyntax memberAccess,
            ExceptionSyntaxDetails details, int numArgumentsRequired,
            Func <ArgumentSyntax, int, bool> check = null)
        {
            if (details == null)
            {
                throw new ArgumentNullException(nameof(details));
            }

            if (memberAccess?.Parent is InvocationExpressionSyntax invocation &&
                invocation.ArgumentList?.Arguments.Count == numArgumentsRequired)
            {
                for (int i = 0; i < invocation.ArgumentList.Arguments.Count; i++)
                {
                    if (check != null && !check(invocation.ArgumentList.Arguments[i], i))
                    {
                        details.SetInconclusive(invocation.ArgumentList.Arguments[i]?.ToString());
                        return(null);
                    }
                }

                return(invocation.ArgumentList);
            }

            details.SetInconclusive(memberAccess?.ToString());
            return(null);
        }
コード例 #2
0
        public static ArgumentListSyntax TransformParentInvocationArguments(
            this MemberAccessExpressionSyntax memberAccess,
            ExceptionSyntaxDetails details, int numArgumentsRequired,
            Func <ArgumentSyntax, int, ArgumentSyntax> transform
            )
        {
            if (details == null)
            {
                throw new ArgumentNullException(nameof(details));
            }
            if (transform == null)
            {
                throw new ArgumentNullException(nameof(transform));
            }

            if (memberAccess?.Parent is InvocationExpressionSyntax invocation &&
                invocation.ArgumentList?.Arguments.Count == numArgumentsRequired)
            {
                var result = new SeparatedSyntaxList <ArgumentSyntax>();
                for (int i = 0; i < invocation.ArgumentList.Arguments.Count; i++)
                {
                    var transformed = transform(invocation.ArgumentList.Arguments[i], i);
                    if (transformed == null)
                    {
                        details.SetInconclusive(invocation.ArgumentList.Arguments[i]?.ToString());
                        return(null);
                    }
                    result = result.Add(transformed);
                }
                return(SyntaxFactory.ArgumentList(result));
            }

            details.SetInconclusive(memberAccess?.ToString());
            return(null);
        }
コード例 #3
0
        private bool TryMemberExpression(MemberAccessExpressionSyntax memberAccessExpression,
                                         IDom newItem,
                                         SemanticModel model,
                                         ref object value,
                                         ref LiteralKind literalKind,
                                         ref string constantIdentifier)
        {
            if (memberAccessExpression == null)
            {
                return(false);
            }
            literalKind = LiteralKind.MemberAccess;
            // If this is legal code, this is a constant or an enum
            var constant = model.GetConstantValue(memberAccessExpression);

            if (constant.HasValue)
            {
                constantIdentifier = memberAccessExpression.ToString();
                value = constant.Value;
            }
            else
            {
                constantIdentifier = memberAccessExpression.ToFullString();
                value = memberAccessExpression.ToFullString();
            }
            return(true);
        }
コード例 #4
0
        public bool IsEligible(MemberAccessExpressionSyntax node)
        {
            var nodeString     = node.ToString();
            var nodeNameString = node.Name.ToString();

            return(nodeString.Contains("Arg") && (nodeNameString.Contains("Matches") || nodeString.Contains(".List.ContainsAll")));
        }
コード例 #5
0
ファイル: ArgAnything.cs プロジェクト: hajirazin/MoqConverter
        public SyntaxNode Visit(MemberAccessExpressionSyntax node)
        {
            var nodeString = node.ToString();

            nodeString = Regex.Replace(nodeString, "Arg(<[a-zA-Z0-9,_. <>\\[\\]]+>).Is.Anything", "It.IsAny$1()");
            nodeString = Regex.Replace(nodeString, "Arg(<[a-zA-Z0-9,_. <>\\[\\]]+>).Is.TypeOf", "It.IsAny$1()");
            return(SyntaxFactory.ParseExpression(nodeString));
        }
コード例 #6
0
        private static string[] ExtractPath(MemberAccessExpressionSyntax expression)
        {
            var path = expression.ToString().Split(".");

            return(path
                   .Skip(1)             // skipping variable name e.g. 'result'
                   .ToArray());
        }
コード例 #7
0
ファイル: ArgAnything.cs プロジェクト: hajirazin/MoqConverter
        public bool IsEligible(MemberAccessExpressionSyntax node)
        {
            var nodeString     = node.ToString();
            var nodeNameString = node.Name.ToString();

            return(nodeString.Contains("Arg") &&
                   (nodeNameString.Contains("Anything") || nodeNameString.Contains("TypeOf")));
        }
コード例 #8
0
        public SyntaxNode Visit(MemberAccessExpressionSyntax node)
        {
            var nodeString = node.ToString();

            nodeString = Regex.Replace(nodeString, "Arg(<[a-zA-Z0-9,_ <>\\[\\]]+>)(.*)Matches", "It.Is$1", RegexOptions.Singleline);
            nodeString = Regex.Replace(nodeString, "Arg(<[a-zA-Z0-9,_ <>\\[\\]]+>).List.ContainsAll", "It.IsIn$1", RegexOptions.Singleline);
            return(SyntaxFactory.ParseExpression(nodeString));
        }
コード例 #9
0
        public override void VisitMemberAccessExpression(MemberAccessExpressionSyntax node)
        {
            if (_targetPatternRegEx.Match(node.ToString()).Success)
            {
                RecordMatchAndContext(node, BlockType.None);
            }

            base.VisitMemberAccessExpression(node);
        }
コード例 #10
0
ファイル: ArgIsEqual.cs プロジェクト: hajirazin/MoqConverter
        public bool IsEligible(MemberAccessExpressionSyntax node)
        {
            var nodeString     = node.ToString();
            var nodeNameString = node.Name.ToString();

            return(nodeString.Contains("Arg") &&
                   (nodeNameString.Contains("Equal") || nodeNameString.Contains("Same") ||
                    nodeNameString.Contains("Null")));
        }
コード例 #11
0
ファイル: ArgIsEqual.cs プロジェクト: hajirazin/MoqConverter
        public SyntaxNode Visit(MemberAccessExpressionSyntax node)
        {
            var nodeString = node.ToString();

            nodeString = Regex.Replace(nodeString, "Arg(<[a-zA-Z0-9,_ <>\\[\\]]+>).Is.Equal", "It.IsIn");
            nodeString = Regex.Replace(nodeString, "Arg(<[a-zA-Z0-9,_ <>\\[\\]]+>).Is.Same", "It.IsIn");
            nodeString = Regex.Replace(nodeString, "Arg<([a-zA-Z0-9,_ <>\\[\\]]+)>.Is.Null", "It.IsIn(($1)null)");
            nodeString = Regex.Replace(nodeString, "Arg<([a-zA-Z0-9,_ <>\\[\\]]+)>.Is.NotNull", "It.Is<$1>(a => a != null)");
            return(SyntaxFactory.ParseExpression(nodeString));
        }
コード例 #12
0
            public override void VisitMemberAccessExpression(MemberAccessExpressionSyntax node)
            {
                base.VisitMemberAccessExpression(node);

                var isInsideMethod       = Helpers.IsInsideMethod(node);
                var isInsideMemberAccess = Helpers.IsInsideMemberAccessExpression(node);
                var isValidParent        = !isInsideMethod.result && !isInsideMemberAccess.result;

                if (isValidParent)
                {
                    IdentifierNames.Add(node.ToString());
                }
            }
コード例 #13
0
        public override void VisitMemberAccessExpression(MemberAccessExpressionSyntax node)
        {
            // check if access to DMA property
            var identifiers = node.RecursiveFlatIdentifiers();

            if (identifiers.Any() && identifiers[0].ToString() == "SOC")
            {
                var dmaType = TypeResolver.ResolveType(identifiers[0]);
                Expression = new IdentifierExpressionCPPModel()
                {
                    Identifier = $"{dmaType.Namespace}_{dmaType.Name}_{identifiers.Last().Identifier}"
                };

                return;
            }

            if (BuiltInValues.IsBuiltInValue(node.ToString()))
            {
                var type = TypeResolver.ResolveType(node);
                if (type == typeof(char))
                {
                    Expression = new LiteralExpressionCPPModel()
                    {
                        Value = $"'{BuiltInValues.BuiltInValue(node.ToString())}'"
                    };
                }
                else
                {
                    Expression = new LiteralExpressionCPPModel()
                    {
                        Value = BuiltInValues.BuiltInValue(node.ToString()).ToString()
                    };
                }

                return;
            }

            Unsupported(node, "Unsupported member access expression");
        }
コード例 #14
0
ファイル: Mollifier.cs プロジェクト: hajirazin/MoqConverter
        public static ExpressionSyntax MakeCompilerHappy(MemberAccessExpressionSyntax member, string methodName)
        {
            var str = member.ToString();

            VariableCount.GetOrAdd(methodName, -1);
            VariableCount[methodName]++;
            var count = VariableCount[methodName];

            str = $"var variableToMakeCompilerHappy{(count == 0 ? "" : count.ToString())} = " + str;
            var statement = SyntaxFactory.ParseExpression(str);

            return(statement);
        }
コード例 #15
0
        public static ContractCategory GetContractCategory(this MemberAccessExpressionSyntax expressionSyntax)
        {
            var parts = expressionSyntax?.ToString()?.Split('.').Reverse().Take(2).ToArray();

            if (parts?.Length != 2 || (parts[1] != "Contract"))
            {
                return(ContractCategory.Unknown);
            }

            ContractCategory result;

            return(Enum.TryParse(parts[0], out result) ? result : ContractCategory.Unknown);
        }
コード例 #16
0
        public override string?GetDefaultValue(IPropertySymbol propertySymbol)
        {
            var declaration         = propertySymbol.DeclaringSyntaxReferences.First();
            var propertyDeclaration = declaration.GetSyntax() as PropertyStatementSyntax;

            if (propertyDeclaration?.Initializer is null)
            {
                return(null);
            }
            return(propertyDeclaration.Initializer.Value switch
            {
                LiteralExpressionSyntax s => s.Token.ValueText,
                ObjectCreationExpressionSyntax s => s.ToString(),
                MemberAccessExpressionSyntax s => s.ToString(),
                _ => $"Type not handled: {propertyDeclaration.Initializer.Value.GetType()}"
            });
        public override SyntaxNode VisitMemberAccessExpression(MemberAccessExpressionSyntax node)
        {
            SyntaxNode r_node = node;

            if (node.IsKind(SyntaxKind.SimpleMemberAccessExpression) && node.ToString() == "ById.OnLeft")
            {
                var p = node.HasParent<ArgumentSyntax, ArgumentListSyntax, InvocationExpressionSyntax, EqualsValueClauseSyntax, VariableDeclaratorSyntax>();
                if (p == null)
                {

                }
                else
                {
                    var byId = SyntaxFactory.ParseExpression("\"#" + p.Identifier.Text + "\"");
                    //var argById = SyntaxFactory.Argument(byId);
                    r_node = byId;
                }
            }

            return r_node;
        }
コード例 #18
0
        private void Initialize(int depth, MemberAccessExpressionSyntax memberAccessExpressionSyntax,
                                IPropertySymbol propertySymbol, SemanticModel semanticModel)
        {
            Depth            = depth;
            IsProperty       = true;
            InvocationString = memberAccessExpressionSyntax.ToString();
            var containingNode = memberAccessExpressionSyntax.Ancestors().OfType <StatementSyntax>().FirstOrDefault();

            OwnerStatementString = containingNode?.ToString();

            var objectAccessedSyntax     = memberAccessExpressionSyntax.Expression; // .ToString() => var name
            var objectAccessedSymbol     = semanticModel.GetSymbolInfo(objectAccessedSyntax).Symbol;
            var objectAccessedTypeSymbol = semanticModel.GetTypeInfo(objectAccessedSyntax).Type;

            MemberOwnerType = new TypeDescriptor(objectAccessedTypeSymbol);

            MemberName = propertySymbol.Name;
            ReturnType = new TypeDescriptor(propertySymbol.Type);
            var containingTypeSymbol = propertySymbol.ContainingType;

            ContainingType = new TypeDescriptor(containingTypeSymbol);

            PropertyDeclarationSyntax = SymbolHelper.GetSyntaxReferences(memberAccessExpressionSyntax, semanticModel)
                                        .FirstOrDefault()
                                        ?.GetSyntax() as PropertyDeclarationSyntax;
            var assignment = memberAccessExpressionSyntax.Ancestors().OfType <AssignmentExpressionSyntax>().FirstOrDefault();

            if (assignment != null && assignment.Left.DescendantNodesAndSelf().Contains(memberAccessExpressionSyntax))
            {
                // is a set property
                IsPropertySetter = true;
            }
            else
            {
                // is a get property
            }
        }
コード例 #19
0
 private static bool IsIssue(MemberAccessExpressionSyntax syntaxNode) => syntaxNode.ToString() == GuidNewGuidInvocation;
コード例 #20
0
 public static bool IsCollectionSizeExpression(this MemberAccessExpressionSyntax node) =>
 node.ToString() == "Has.Length.EqualTo" || node.ToString() == "Has.Count.EqualTo";
        bool ConditionContainsNullCheck(ExpressionSyntax condition, ExpressionSyntax identifierToCheck)
        {
            var identifierNameToCheck         = identifierToCheck as IdentifierNameSyntax;
            var memberAccessExpressionToCheck = identifierToCheck as MemberAccessExpressionSyntax;

            return(condition.DescendantNodesAndSelf().Any(n =>
            {
                var binaryExpr = n as BinaryExpressionSyntax;
                if (binaryExpr != null)
                {
                    IdentifierNameSyntax identifierName = binaryExpr.Left as IdentifierNameSyntax;
                    if ((identifierName != null) && (identifierNameToCheck != null) && (identifierName.Identifier.ValueText == identifierNameToCheck.Identifier.ValueText))
                    {
                        return binaryExpr.IsKind(SyntaxKind.IsNotExpression) && binaryExpr.Right.IsKind(SyntaxKind.NothingLiteralExpression);
                    }
                    MemberAccessExpressionSyntax memberAccessExpressionSyntax = binaryExpr.Left as MemberAccessExpressionSyntax;
                    if ((memberAccessExpressionSyntax != null) && (memberAccessExpressionToCheck != null) && (memberAccessExpressionSyntax.ToString() == identifierToCheck.ToString()))
                    {
                        return binaryExpr.IsKind(SyntaxKind.IsNotExpression) && binaryExpr.Right.IsKind(SyntaxKind.NothingLiteralExpression);
                    }

                    identifierName = binaryExpr.Right as IdentifierNameSyntax;
                    if ((identifierName != null) && (identifierNameToCheck != null) && (identifierName.Identifier.ValueText == identifierNameToCheck.Identifier.ValueText))
                    {
                        return binaryExpr.IsKind(SyntaxKind.IsNotExpression) && binaryExpr.Left.IsKind(SyntaxKind.NothingLiteralExpression);
                    }
                    memberAccessExpressionSyntax = binaryExpr.Right as MemberAccessExpressionSyntax;
                    if ((memberAccessExpressionSyntax != null) && (memberAccessExpressionToCheck != null) && (memberAccessExpressionSyntax.ToString() == identifierToCheck.ToString()))
                    {
                        return binaryExpr.IsKind(SyntaxKind.IsNotExpression) && binaryExpr.Left.IsKind(SyntaxKind.NothingLiteralExpression);
                    }
                }

                return false;
            }));
        }
コード例 #22
0
        /// <summary>
        /// メンバーアクセス式構文のTypeScript変換
        /// </summary>
        /// <param name="condition">ExpressionSyntaxインスタンス</param>
        /// <param name="localDeclarationStatements">ローカル変数リスト</param>
        /// <returns>TypeScriptに変換した文字列</returns>
        private string ConvertExpression(MemberAccessExpressionSyntax condition, List <string> localDeclarationStatements)
        {
            var result = condition.ToString();

            if (condition.Expression is IdentifierNameSyntax == false)
            {
                result  = $"{GetExpression(condition.Expression, localDeclarationStatements)}{condition.OperatorToken}";
                result += condition.Name;
            }

            // メソッドをTypeScript用に置換え
            result = AnalyzeUtility.ReplaceMethodName(result);

            // thisをつけるかの判定
            var targetCondition = condition as ExpressionSyntax;

            if (condition.Expression is ElementAccessExpressionSyntax eaes)
            {
                targetCondition = eaes.Expression;
            }
            if (!IsLocalDeclarationStatement(targetCondition, localDeclarationStatements))
            {
                if (!result.StartsWith("this.", StringComparison.CurrentCulture))
                {
                    return("this." + result);
                }
            }

            // 内部クラスのクラス名変更
            if (condition.Expression is IdentifierNameSyntax identifier)
            {
                var identifierName = identifier.Identifier.ValueText;

                // ローカルフィールドの場合はそのまま返す
                if (localDeclarationStatements.Contains(identifierName))
                {
                    return(result);
                }

                var classObject = ClassObject.GetInstance();

                // 別クラスの場合はクラス名置換えを実施
                var otherClassNames = new List <string>()
                {
                    identifierName,
                    condition.ToString(),
                    $"{classObject.ProcessClassName}.{identifierName}"
                };
                foreach (var className in otherClassNames)
                {
                    if (classObject.RenameClasseNames.Keys.Contains(className))
                    {
                        result = classObject.RenameClasseNames[className];
                        if (className.StartsWith($"{classObject.ProcessClassName}.", StringComparison.CurrentCulture) && condition.Name.ToString() != identifierName && classObject.ProcessClassName != identifierName)
                        {
                            result += $".{condition.Name}";
                        }

                        return(result);
                    }
                }

                // クラスメンバの場合はそのまま返す
                var myMethodNames = new List <string>()
                {
                    identifierName,
                    condition.Name.ToString()
                };

                foreach (var methodName in myMethodNames)
                {
                    if (classObject.StaticMembers.Where(item => item.Key == classObject.ProcessClassName).
                        Any(item => item.Value.Contains(methodName)))
                    {
                        return(result);
                    }
                }
            }

            return(result);
        }
コード例 #23
0
 public override void VisitMemberAccessExpression(MemberAccessExpressionSyntax node)
 {
     Value = node.ToString();
     //base.VisitMemberAccessExpression(node);
 }