static public MethodExpressionAnalysis FromSemanticModel(MethodDeclarationSyntax methodSyntax, SemanticModel semanticModel)
        {
            var expression = SyntaxOperations.GetBodyOfMethod(methodSyntax).B.Common;
            var dataFlow   = semanticModel.AnalyzeDataFlow(expression);

            return(new MethodExpressionAnalysis(methodSyntax, expression, semanticModel, dataFlow));
        }
Exemple #2
0
        static public (IXor2ComputationNodeReference, AlreadyProcessedSyntaxNodes) FromReturnStatement(ReturnStatementSyntax returnSyntax, MethodBlockAnalysis methodAnalysis, TextSpan span, AlreadyProcessedSyntaxNodes processedNodesOrNull = null)
        {
            Throw.IfNot(methodAnalysis.DataFlowAnalysis.Succeeded);


            var processedNodes = (processedNodesOrNull ?? new AlreadyProcessedSyntaxNodes());

            if (!span.Contains(returnSyntax.Span))
            {
                return(_CreatePair(Xor2ComputationNodeReference.OutOfScope(returnSyntax), processedNodes));
            }

            var rhsSyntax = SyntaxOperations.GetRightHandSideExpression(returnSyntax);

            var previous = _DispatchXor7ExpressionSyntax(rhsSyntax, methodAnalysis, processedNodes ?? new AlreadyProcessedSyntaxNodes(), span);

            var node = ComputationGraphNode.FromReturnStatement(returnSyntax, previous.Item1);


            if (!previous.Item1.IsA)
            {
                return(_CreatePair(node, previous.Item2));
            }


            return(_CreatePair(node, previous.Item2));
        }
Exemple #3
0
        static public MethodBlockAnalysis FromSemanticModel(MethodDeclarationSyntax methodSyntax, SemanticModel semanticModel)
        {
            var block       = SyntaxOperations.GetBodyOfMethod(methodSyntax).A;
            var controlFlow = semanticModel.AnalyzeControlFlow(block);
            var dataFlow    = semanticModel.AnalyzeDataFlow(block);

            return(new MethodBlockAnalysis(methodSyntax, block, semanticModel, controlFlow, dataFlow));
        }
Exemple #4
0
        static public Maybe <FuncResult <IXor4IdentifierOriginSyntax, SimpleControlFlowAnalysisError> > GetIdentifierDeclarationSyntax(IdentifierNameSyntax syntax, MethodBlockAnalysis methodAnalysis)
        {
            Maybe <FuncResult <IXor4IdentifierOriginSyntax, SimpleControlFlowAnalysisError> > __Ok(IXor4IdentifierOriginSyntax ok) => new FuncResult <IXor4IdentifierOriginSyntax, SimpleControlFlowAnalysisError>(ok);
            Maybe <FuncResult <IXor4IdentifierOriginSyntax, SimpleControlFlowAnalysisError> > __Error(SimpleControlFlowAnalysisError error) => new FuncResult <IXor4IdentifierOriginSyntax, SimpleControlFlowAnalysisError>(error);


            var loopLikeSyntax = syntax.Ancestors().FirstOrDefault(x => SyntaxOperations.IsLoopLike(x));

            if (loopLikeSyntax != null)
            {
                return(__Error(SimpleControlFlowAnalysisError.NotALinearControlFlow(loopLikeSyntax)));
            }
            else
            {
                var symbolInfo = methodAnalysis.SemanticModel.GetSymbolInfo(syntax);


                switch (symbolInfo.Symbol.Kind)
                {
                case SymbolKind.NamedType:
                case SymbolKind.Namespace:
                {
                    return(Maybe.NoValue);
                }

                case SymbolKind.Local:
                {
                    var declaratorSyntax = (VariableDeclaratorSyntax)symbolInfo.Symbol.DeclaringSyntaxReferences.Single().GetSyntax();
                    var delarationSyntax = declaratorSyntax.Ancestors().OfType <LocalDeclarationStatementSyntax>().First();
                    return(__Ok(new Xor4IdentifierOriginSyntax(delarationSyntax)));
                }

                case SymbolKind.Field:
                {
                    var declaringSyntax = (FieldDeclarationSyntax)symbolInfo.Symbol.DeclaringSyntaxReferences.Single().GetSyntax();
                    return(__Ok(new Xor4IdentifierOriginSyntax(declaringSyntax)));
                }

                case SymbolKind.Property:
                {
                    var declaringSyntax = (PropertyDeclarationSyntax)symbolInfo.Symbol.DeclaringSyntaxReferences.Single().GetSyntax();
                    return(__Ok(new Xor4IdentifierOriginSyntax(declaringSyntax)));
                }

                case SymbolKind.Parameter:
                {
                    var declaringSyntax = (ParameterSyntax)symbolInfo.Symbol.DeclaringSyntaxReferences.Single().GetSyntax();
                    return(__Ok(new Xor4IdentifierOriginSyntax(declaringSyntax)));
                }

                default:
                    throw NotPreparedForThatCase.UnexpectedEnumException(symbolInfo.Symbol.Kind);
                }
            }
        }
        static (ConstructorSyntaxLink, bool IsCompleted) _StartingFromRec(ConstructorDeclarationSyntax ctorDeclarationSyntax, ClassDeclarationSyntax owingType, SemanticModel semanticModel)
        {
            var syntaxTree = ctorDeclarationSyntax.SyntaxTree;

            var nextCtorPath = (ConstructorInitializerSyntax)ctorDeclarationSyntax
                               .DescendantNodes()
                               .Where(x => x.Kind() == SyntaxKind.BaseConstructorInitializer || x.Kind() == SyntaxKind.ThisConstructorInitializer)
                               .SingleOrDefault();

            if (nextCtorPath == null)
            {
                return(_CreateFinalLink(owingType, ctorDeclarationSyntax), IsCompleted : true);
            }


            switch (nextCtorPath.Kind())
            {
            case SyntaxKind.ThisConstructorInitializer:
            {
                var nextCtor = _GetConstructor(owingType, nextCtorPath, semanticModel);

                if (!nextCtor.Exists)
                {
                    var incompleteLink = _CreateIncompleteIntermediateLink(owingClass: owingType, thisCtorDeclarationSyntax: ctorDeclarationSyntax, pathToNextCtor: nextCtorPath);
                    return(incompleteLink, IsCompleted : false);
                }

                var(nextLink, isComplete) = _StartingFromRec(nextCtor.Value, owingType, semanticModel: semanticModel);
                var link = _CreateIntermediateLink(nextLink, owingClass: owingType, thisCtorDeclarationSyntax: ctorDeclarationSyntax, pathToNextCtor: nextCtorPath);
                return(link, isComplete);
            }

            case SyntaxKind.BaseConstructorInitializer:
            {
                var baseTypeSyntax = SyntaxOperations.GetBaseTypeOf(owingType, syntaxTree, semanticModel).Value;
                var nextCtor       = _GetConstructor(baseTypeSyntax, nextCtorPath, semanticModel);

                if (!nextCtor.Exists)
                {
                    var incompleteLink = _CreateIncompleteIntermediateLink(owingClass: owingType, thisCtorDeclarationSyntax: ctorDeclarationSyntax, pathToNextCtor: nextCtorPath);
                    return(incompleteLink, IsCompleted : false);
                }

                var(nextLink, isCompleted) = _StartingFromRec(nextCtor.Value, owingType: baseTypeSyntax, semanticModel: semanticModel);
                var link = _CreateIntermediateLink(nextLink, owingClass: owingType, thisCtorDeclarationSyntax: ctorDeclarationSyntax, pathToNextCtor: nextCtorPath);
                return(link, isCompleted);
            }


            default:
                throw NotPreparedForThatCase.CannotHappenException;
            }
        }