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); } }
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())); }