예제 #1
0
            GetSignatureInformation(
                DataFlowAnalysis dataFlowAnalysisData,
                IDictionary <ISymbol, VariableInfo> variableInfoMap,
                bool isInExpressionOrHasReturnStatement)
            {
                var model       = _semanticDocument.SemanticModel;
                var compilation = model.Compilation;

                if (isInExpressionOrHasReturnStatement)
                {
                    // check whether current selection contains return statement
                    var parameters = GetMethodParameters(variableInfoMap.Values);
                    var returnType = SelectionResult.GetContainingScopeType() ?? compilation.GetSpecialType(SpecialType.System_Object);

                    var unsafeAddressTakenUsed = ContainsVariableUnsafeAddressTaken(dataFlowAnalysisData, variableInfoMap.Keys);
                    return(parameters, returnType, default(VariableInfo), unsafeAddressTakenUsed);
                }
                else
                {
                    // no return statement
                    var parameters = MarkVariableInfoToUseAsReturnValueIfPossible(GetMethodParameters(variableInfoMap.Values));
                    var variableToUseAsReturnValue = parameters.FirstOrDefault(v => v.UseAsReturnValue);
                    var returnType = variableToUseAsReturnValue != null
                        ? variableToUseAsReturnValue.GetVariableType(_semanticDocument)
                        : compilation.GetSpecialType(SpecialType.System_Void);

                    var unsafeAddressTakenUsed = ContainsVariableUnsafeAddressTaken(dataFlowAnalysisData, variableInfoMap.Keys);
                    return(parameters, returnType, variableToUseAsReturnValue, unsafeAddressTakenUsed);
                }
            }
예제 #2
0
            protected IEnumerable <TStatement> AddReturnIfUnreachable(IEnumerable <TStatement> statements)
            {
                if (AnalyzerResult.EndOfSelectionReachable)
                {
                    return(statements);
                }

                var type = SelectionResult.GetContainingScopeType();

                if (type != null && type.SpecialType != SpecialType.System_Void)
                {
                    return(statements);
                }

                // no return type + end of selection not reachable
                if (LastStatementOrHasReturnStatementInReturnableConstruct())
                {
                    return(statements);
                }

                return(statements.Concat(CreateReturnStatement()));
            }