// Sets up the method's block. public override void SetupBlock() { if (context.block() != null) { block = new BlockAction(parseInfo.SetCallInfo(CallInfo), BlockScope, context.block()); BlockTreeScan validation = new BlockTreeScan(doesReturnValue, parseInfo, this); validation.ValidateReturns(); multiplePaths = validation.MultiplePaths; } foreach (var listener in listeners) { listener.Applied(); } }
// Sets up the method's block. public override void SetupBlock() { if (Context.block() != null) { Block = new BlockAction(parseInfo.SetCallInfo(CallInfo), methodScope.Child(), Context.block()); // Validate returns. BlockTreeScan validation = new BlockTreeScan(DoesReturnValue, parseInfo, this); validation.ValidateReturns(); MultiplePaths = validation.MultiplePaths; // If there is only one return statement, set SingleReturnValue. if (validation.Returns.Length == 1) { SingleReturnValue = validation.Returns[0].ReturningValue; } // If the return type is a constant type... if (ReturnType != null && ReturnType.IsConstant()) { // ... iterate through each return statement ... foreach (ReturnAction returnAction in validation.Returns) { // ... If the current return statement returns a value and that value does not implement the return type ... if (returnAction.ReturningValue != null && (returnAction.ReturningValue.Type() == null || !returnAction.ReturningValue.Type().Implements(ReturnType))) { // ... then add a syntax error. parseInfo.Script.Diagnostics.Error("Must return a value of type '" + ReturnType.GetName() + "'.", returnAction.ErrorRange); } } } } WasApplied = true; foreach (var listener in listeners) { listener.Applied(); } }