public static Task <HandledEventsAnalysis> AnalyzeAsync(CommonConversions commonConversions, INamedTypeSymbol type, IMethodSymbol designerGeneratedInitializeComponentOrNull,
                                                                ILookup <ITypeSymbol, ITypeSymbol> typeToInheritors)
        {
            var initializeComponentLocationOrNull = designerGeneratedInitializeComponentOrNull?.DeclaringSyntaxReferences.Select(r => r.GetSyntax()).OfType <MethodStatementSyntax>().OrderByDescending(m => m.Span.Length).Select(s => s.Parent.GetLocation()).FirstOrDefault();

            return(new HandledEventsAnalyzer(commonConversions, type, initializeComponentLocationOrNull, typeToInheritors).AnalyzeAsync());
        }
Пример #2
0
        public async Task <SyntaxList <StatementSyntax> > CreateLocalsAsync(VBasic.VisualBasicSyntaxNode vbNode, IEnumerable <StatementSyntax> csNodes, HashSet <string> generatedNames, SemanticModel semanticModel)
        {
            var preDeclarations = new List <StatementSyntax>();
            var postAssignments = new List <StatementSyntax>();

            var additionalDeclarationInfo = GetDeclarations();
            var newNames = additionalDeclarationInfo.ToDictionary(l => l.Id, l =>
                                                                  NameGenerator.GetUniqueVariableNameInScope(semanticModel, generatedNames, vbNode, l.Prefix)
                                                                  );

            foreach (var additionalLocal in additionalDeclarationInfo)
            {
                var decl = CommonConversions.CreateVariableDeclarationAndAssignment(newNames[additionalLocal.Id],
                                                                                    additionalLocal.Initializer, additionalLocal.Type);
                preDeclarations.Add(CS.SyntaxFactory.LocalDeclarationStatement(decl));
            }

            foreach (var additionalAssignment in GetPostAssignments())
            {
                var assign = CS.SyntaxFactory.AssignmentExpression(CS.SyntaxKind.SimpleAssignmentExpression, additionalAssignment.LeftHandSide, additionalAssignment.RightHandSide);
                postAssignments.Add(CS.SyntaxFactory.ExpressionStatement(assign));
            }

            var statementsWithUpdatedIds = ReplaceNames(preDeclarations.Concat(csNodes).Concat(postAssignments), newNames);

            return(CS.SyntaxFactory.List(statementsWithUpdatedIds));
        }
Пример #3
0
        private SyntaxList <StatementSyntax> AddLocalVariables(VBasic.VisualBasicSyntaxNode node)
        {
            _additionalLocals.PushScope();
            IEnumerable <SyntaxNode> csNodes = _wrappedVisitor.Visit(node);

            var additionalDeclarations = new List <StatementSyntax>();

            if (_additionalLocals.Count() > 0)
            {
                var newNames = new Dictionary <string, string>();
                csNodes = csNodes.Select(csNode => csNode.ReplaceNodes(csNode.GetAnnotatedNodes(AdditionalLocals.Annotation), (an, _) => {
                    var id       = (an as IdentifierNameSyntax).Identifier.ValueText;
                    newNames[id] = NameGenerator.GetUniqueVariableNameInScope(_semanticModel, _generatedNames, node, _additionalLocals[id].Prefix);
                    return(SyntaxFactory.IdentifierName(newNames[id]));
                })).ToList();

                foreach (var additionalLocal in _additionalLocals)
                {
                    var decl = CommonConversions.CreateVariableDeclarationAndAssignment(newNames[additionalLocal.Key], additionalLocal.Value.Initializer);
                    additionalDeclarations.Add(SyntaxFactory.LocalDeclarationStatement(decl));
                }
            }
            _additionalLocals.PopScope();

            return(SyntaxFactory.List(additionalDeclarations.Concat(csNodes)));
        }
Пример #4
0
            public async Task <ExpressionSyntax> ConvertNothingComparisonOrNullAsync(VBSyntax.ExpressionSyntax exprNode, bool negateExpression = false)
            {
                if (!(exprNode is VBSyntax.BinaryExpressionSyntax node) || !node.IsKind(VBasic.SyntaxKind.IsExpression, VBasic.SyntaxKind.EqualsExpression, VBasic.SyntaxKind.IsNotExpression, VBasic.SyntaxKind.NotEqualsExpression))
                {
                    return(null);
                }
                ExpressionSyntax otherArgument;

                if (node.Left.IsKind(VBasic.SyntaxKind.NothingLiteralExpression))
                {
                    otherArgument = (ExpressionSyntax) await ConvertIsOrIsNotExpressionArgAsync(node.Right);
                }
                else if (node.Right.IsKind(VBasic.SyntaxKind.NothingLiteralExpression))
                {
                    otherArgument = (ExpressionSyntax) await ConvertIsOrIsNotExpressionArgAsync(node.Left);
                }
                else
                {
                    return(null);
                }

                var isReference = node.IsKind(VBasic.SyntaxKind.IsExpression, VBasic.SyntaxKind.IsNotExpression);
                var notted      = node.IsKind(VBasic.SyntaxKind.IsNotExpression, VBasic.SyntaxKind.NotEqualsExpression) || negateExpression;

                return(notted ? CommonConversions.NotNothingComparison(otherArgument, isReference) : CommonConversions.NothingComparison(otherArgument, isReference));
            }
Пример #5
0
        public ClassDeclarationSyntax GenerateHelper()
        {
            if (!HasImports)
            {
                return(null);
            }

            var xAttributeList = SyntaxFactory.FieldDeclaration(
                SyntaxFactory.List <AttributeListSyntax>(),
                SyntaxFactory.TokenList(SyntaxFactory.Token(CSSyntaxKind.PrivateKeyword), SyntaxFactory.Token(CSSyntaxKind.StaticKeyword)),
                CommonConversions.CreateVariableDeclarationAndAssignment(
                    "namespaceAttributes", SyntaxFactory.InitializerExpression(
                        CSSyntaxKind.ArrayInitializerExpression,
                        SyntaxFactory.SeparatedList <ExpressionSyntax>(
                            from x in _xNamespaceFields
                            let fieldIdentifierName = SyntaxFactory.IdentifierName(x.Declaration.Variables.Single().Identifier)
                                                      let namespaceNameExpression = SyntaxFactory.MemberAccessExpression(CSSyntaxKind.SimpleMemberAccessExpression, fieldIdentifierName, SyntaxFactory.IdentifierName("NamespaceName"))
                                                                                    let attributeNameExpression = fieldIdentifierName.IsEquivalentTo(DefaultIdentifierName) ? CommonConversions.Literal("xmlns") : BuildXmlnsAttributeName(fieldIdentifierName)
                                                                                                                  let arguments = SyntaxFactory.Argument(attributeNameExpression).Yield().Concat(SyntaxFactory.Argument(namespaceNameExpression))
                                                                                                                                  select SyntaxFactory.ObjectCreationExpression(SyntaxFactory.IdentifierName("XAttribute")).WithArgumentList(SyntaxFactory.ArgumentList(SyntaxFactory.SeparatedList(arguments))))),
                    SyntaxFactory.ArrayType(SyntaxFactory.IdentifierName("XAttribute"), SyntaxFactory.SingletonList(SyntaxFactory.ArrayRankSpecifier(SyntaxFactory.SingletonSeparatedList <ExpressionSyntax>(SyntaxFactory.OmittedArraySizeExpression()))))));


            var boilerplate = SyntaxFactory.ParseStatement(@"
                TContainer Apply<TContainer>(TContainer x) where TContainer : XContainer
                {
                    foreach (var d in x.Descendants()) {
                        foreach (var n in namespaceAttributes) {
                            var a = d.Attribute(n.Name);
                            if (a != null && a.Value == n.Value) {
                                a.Remove();
                            }
                        }
                    }
                    x.Add(namespaceAttributes);
                    return x;
                }") as LocalFunctionStatementSyntax;

            var applyMethod = SyntaxFactory.MethodDeclaration(
                SyntaxFactory.List <AttributeListSyntax>(),
                SyntaxFactory.TokenList(SyntaxFactory.Token(CSSyntaxKind.InternalKeyword), SyntaxFactory.Token(CSSyntaxKind.StaticKeyword)),
                boilerplate.ReturnType,
                null,
                boilerplate.Identifier,
                boilerplate.TypeParameterList,
                boilerplate.ParameterList,
                boilerplate.ConstraintClauses,
                boilerplate.Body,
                boilerplate.ExpressionBody);

            return(SyntaxFactory.ClassDeclaration(
                       SyntaxFactory.List <AttributeListSyntax>(),
                       SyntaxFactory.TokenList(SyntaxFactory.Token(CSSyntaxKind.InternalKeyword), SyntaxFactory.Token(CSSyntaxKind.StaticKeyword)),
                       HelperClassUniqueIdentifierName.Identifier,
                       null, null,
                       SyntaxFactory.List <TypeParameterConstraintClauseSyntax>(),
                       SyntaxFactory.List(_xNamespaceFields.Concat <MemberDeclarationSyntax>(xAttributeList).Concat(applyMethod))
                       ));
        }
 private HandledEventsAnalyzer(CommonConversions commonConversions, INamedTypeSymbol type, Location initializeComponentLocationOrNull, ILookup <ITypeSymbol, ITypeSymbol> typeToInheritors)
 {
     _commonConversions = commonConversions;
     _semanticModel     = commonConversions.SemanticModel;
     _type = type;
     _initializeComponentLocationOrNull = initializeComponentLocationOrNull;
     _typeToInheritors = typeToInheritors;
 }
Пример #7
0
 public MethodBodyVisitor(SemanticModel semanticModel, VBasic.VisualBasicSyntaxVisitor <CSharpSyntaxNode> nodesVisitor, Stack <string> withBlockTempVariableNames, TriviaConverter triviaConverter)
 {
     this._semanticModel = semanticModel;
     this._nodesVisitor  = nodesVisitor;
     this._withBlockTempVariableNames = withBlockTempVariableNames;
     CommentConvertingVisitor         = new CommentConvertingMethodBodyVisitor(this, triviaConverter);
     CommonConversions = new CommonConversions(semanticModel, _nodesVisitor);
 }
Пример #8
0
 public MethodBodyVisitor(VBasic.VisualBasicSyntaxNode methodNode, SemanticModel semanticModel,
                          VBasic.VisualBasicSyntaxVisitor <CSharpSyntaxNode> nodesVisitor,
                          Stack <string> withBlockTempVariableNames, HashSet <string> extraUsingDirectives,
                          TriviaConverter triviaConverter)
 {
     _methodNode         = methodNode;
     this._semanticModel = semanticModel;
     this._nodesVisitor  = nodesVisitor;
     this._withBlockTempVariableNames = withBlockTempVariableNames;
     _extraUsingDirectives            = extraUsingDirectives;
     CommentConvertingVisitor         = new CommentConvertingMethodBodyVisitor(this, triviaConverter);
     CommonConversions = new CommonConversions(semanticModel, _nodesVisitor);
 }
            public MethodBodyVisitor(VBasic.VisualBasicSyntaxNode methodNode, SemanticModel semanticModel,
                                     VBasic.VisualBasicSyntaxVisitor <CSharpSyntaxNode> nodesVisitor, CommonConversions commonConversions,
                                     Stack <string> withBlockTempVariableNames, HashSet <string> extraUsingDirectives,
                                     AdditionalLocals additionalLocals, TriviaConverter triviaConverter)
            {
                _methodNode                 = methodNode;
                _semanticModel              = semanticModel;
                _nodesVisitor               = nodesVisitor;
                CommonConversions           = commonConversions;
                _withBlockTempVariableNames = withBlockTempVariableNames;
                _extraUsingDirectives       = extraUsingDirectives;
                var byRefParameterVisitor = new ByRefParameterVisitor(this, additionalLocals, semanticModel, _generatedNames);

                CommentConvertingVisitor = new CommentConvertingMethodBodyVisitor(byRefParameterVisitor, triviaConverter);
            }
        /// <summary>
        /// Make winforms designer work: https://github.com/icsharpcode/CodeConverter/issues/321
        /// </summary>
        public SyntaxList <StatementSyntax> GetPostAssignmentStatements(Microsoft.CodeAnalysis.VisualBasic.Syntax.AssignmentStatementSyntax node, ISymbol potentialPropertySymbol)
        {
            if (CommonConversions.MustInlinePropertyWithEventsAccess(node, potentialPropertySymbol))
            {
                var fieldName      = SyntaxFactory.IdentifierName("_" + potentialPropertySymbol.Name);
                var handledMethods = _handledMethodsFromPropertyWithEventName[potentialPropertySymbol.Name].ToArray();
                if (handledMethods.Any())
                {
                    var postAssignmentStatements = handledMethods.SelectMany(h =>
                                                                             h.GetPostInitializationStatements(potentialPropertySymbol.Name, fieldName));
                    return(SyntaxFactory.List(postAssignmentStatements));
                }
            }

            return(SyntaxFactory.List <StatementSyntax>());
        }
Пример #11
0
        public MethodBodyExecutableStatementVisitor(VBasic.VisualBasicSyntaxNode methodNode, SemanticModel semanticModel,
                                                    CommentConvertingVisitorWrapper <CSharpSyntaxNode> expressionVisitor, CommonConversions commonConversions,
                                                    Stack <ExpressionSyntax> withBlockLhs, HashSet <string> extraUsingDirectives,
                                                    AdditionalLocals additionalLocals, MethodsWithHandles methodsWithHandles,
                                                    TriviaConverter triviaConverter)
        {
            _methodNode           = methodNode;
            _semanticModel        = semanticModel;
            _expressionVisitor    = expressionVisitor;
            CommonConversions     = commonConversions;
            _withBlockLhs         = withBlockLhs;
            _extraUsingDirectives = extraUsingDirectives;
            _methodsWithHandles   = methodsWithHandles;
            var byRefParameterVisitor = new ByRefParameterVisitor(this, additionalLocals, semanticModel, _generatedNames);

            CommentConvertingVisitor = new CommentConvertingMethodBodyVisitor(byRefParameterVisitor, triviaConverter);
        }
            public async Task <ExpressionSyntax> ConvertReferenceOrNothingComparisonOrNullAsync(VBSyntax.ExpressionSyntax exprNode, bool negateExpression = false)
            {
                if (!(exprNode is VBSyntax.BinaryExpressionSyntax node) ||
                    !node.IsKind(VBasic.SyntaxKind.IsExpression, VBasic.SyntaxKind.EqualsExpression, VBasic.SyntaxKind.IsNotExpression, VBasic.SyntaxKind.NotEqualsExpression))
                {
                    return(null);
                }

                var notted =
                    node.IsKind(VBasic.SyntaxKind.IsNotExpression, VBasic.SyntaxKind.NotEqualsExpression) ||
                    negateExpression;
                var isReferenceComparison = node.IsKind(VBasic.SyntaxKind.IsExpression, VBasic.SyntaxKind.IsNotExpression);

                if (ArgComparedToNull(node) is {} vbOtherArg)
                {
                    var csOtherArg = await ConvertIsOrIsNotExpressionArgAsync(vbOtherArg);

                    return(notted
                        ? CommonConversions.NotNothingComparison(csOtherArg, isReferenceComparison)
                        : CommonConversions.NothingComparison(csOtherArg, isReferenceComparison));
                }

                if (isReferenceComparison)
                {
                    var lhs = await ConvertIsOrIsNotExpressionArgAsync(node.Left);

                    var rhs = await ConvertIsOrIsNotExpressionArgAsync(node.Right);

                    var equalityCheck = new KnownMethod(nameof(System), nameof(Object), nameof(object.ReferenceEquals))
                                        .Invoke(_visualBasicEqualityComparison.ExtraUsingDirectives,
                                                ConvertTo(node.Left, lhs, SpecialType.System_Object), rhs);
                    return(notted
                        ? SyntaxFactory.PrefixUnaryExpression(SyntaxKind.LogicalNotExpression, equalityCheck)
                        : equalityCheck);
                }
                return(null);
            }
Пример #13
0
        private ExpressionSyntax BuildXmlnsAttributeName(IdentifierNameSyntax fieldIdentifierName)
        {
            var xmlns = SyntaxFactory.MemberAccessExpression(CSSyntaxKind.SimpleMemberAccessExpression, SyntaxFactory.IdentifierName("XNamespace"), SyntaxFactory.IdentifierName("Xmlns"));

            return(SyntaxFactory.BinaryExpression(CSSyntaxKind.AddExpression, xmlns, CommonConversions.Literal(fieldIdentifierName.Identifier.ValueText)));
        }
Пример #14
0
 public LambdaConverter(CommonConversions commonConversions, SemanticModel semanticModel)
 {
     CommonConversions = commonConversions;
     _semanticModel    = semanticModel;
     _solution         = CommonConversions.Document.Project.Solution;
 }
 public QueryConverter(CommonConversions commonConversions, CommentConvertingVisitorWrapper triviaConvertingVisitor)
 {
     CommonConversions        = commonConversions;
     _triviaConvertingVisitor = triviaConvertingVisitor;
 }
Пример #16
0
 public QueryConverter(CommonConversions commonConversions, SemanticModel semanticModel, CommentConvertingVisitorWrapper triviaConvertingExpressionVisitor)
 {
     CommonConversions        = commonConversions;
     _semanticModel           = semanticModel;
     _triviaConvertingVisitor = triviaConvertingExpressionVisitor;
 }
Пример #17
0
 public QueryConverter(CommonConversions commonConversions, CommentConvertingVisitorWrapper <CSharpSyntaxNode> triviaConvertingVisitor)
 {
     CommonConversions        = commonConversions;
     _triviaConvertingVisitor = triviaConvertingVisitor;
 }
Пример #18
0
        private async Task <SyntaxList <StatementSyntax> > AddLocalVariablesAsync(VBasic.VisualBasicSyntaxNode node, VBasic.SyntaxKind exitableType = default, bool isBreakableInCs = false)
        {
            _additionalLocals.PushScope(exitableType, isBreakableInCs);
            try {
                var convertedStatements = await _wrappedVisitor.Visit(node);

                var withLocals = await _additionalLocals.CreateLocalsAsync(node, convertedStatements, _generatedNames, _semanticModel);

                var allStatements = _additionalLocals.CreateStatements(node, withLocals, _generatedNames, _semanticModel);

                if (isBreakableInCs && exitableType == VBasic.SyntaxKind.TryKeyword)
                {
                    var doOnce = SyntaxFactory.DoStatement(SyntaxFactory.Block(allStatements), CommonConversions.Literal(false));
                    allStatements = SyntaxFactory.SingletonList <StatementSyntax>(doOnce);
                }
                return(allStatements);
            } finally {
                _additionalLocals.PopScope();
            }
        }