/// <summary> /// Returns the type to be used as a field type; generates errors in case the type is not /// supported for anonymous type fields. /// </summary> private TypeSymbol GetAnonymousTypeFieldType( BoundExpression expression, CSharpSyntaxNode errorSyntax, BindingDiagnosticBag diagnostics, ref bool hasError ) { object? errorArg = null; TypeSymbol?expressionType = expression.Type; if (!expression.HasAnyErrors) { if (expression.HasExpressionType()) { RoslynDebug.Assert(expressionType is object); if (expressionType.IsVoidType()) { errorArg = expressionType; expressionType = CreateErrorType( SyntaxFacts.GetText(SyntaxKind.VoidKeyword) ); } else if (expressionType.IsUnsafe()) { errorArg = expressionType; // CONSIDER: we could use an explicit error type instead of the unsafe type. } else if (expressionType.IsRestrictedType()) { errorArg = expressionType; } } else { errorArg = expression.Display; } } if (expressionType is null) { expressionType = CreateErrorType("error"); } if (errorArg != null) { hasError = true; Error( diagnostics, ErrorCode.ERR_AnonymousTypePropertyAssignedBadValue, errorSyntax, errorArg ); // NOTE: ERR_QueryRangeVariableAssignedBadValue is being generated // by query binding code and never reach this point } return(expressionType); }
/// <summary> /// Returns the type to be used as a field type; generates errors in case the type is not /// supported for anonymous type fields. /// </summary> private TypeSymbol GetAnonymousTypeFieldType(BoundExpression expression, CSharpSyntaxNode errorSyntax, DiagnosticBag diagnostics, ref bool hasError) { object errorArg = null; TypeSymbol expressionType = expression.Type; if (!expression.HasAnyErrors) { if (expression.HasExpressionType()) { if (expressionType.SpecialType == SpecialType.System_Void) { errorArg = expressionType; expressionType = CreateErrorType(SyntaxFacts.GetText(SyntaxKind.VoidKeyword)); } else if (expressionType.IsUnsafe()) { errorArg = expressionType; // CONSIDER: we could use an explicit error type instead of the unsafe type. } else if (expressionType.IsRestrictedType()) { errorArg = expressionType; } } else { if (expression.Kind == BoundKind.UnboundLambda) { errorArg = ((UnboundLambda)expression).MessageID.Localize(); } else if (expression.Kind == BoundKind.MethodGroup) { errorArg = MessageID.IDS_MethodGroup.Localize(); } else { Debug.Assert(expression.IsLiteralNull(), "How did we successfully bind an expression without a type?"); errorArg = MessageID.IDS_NULL.Localize(); } } } if ((object)expressionType == null) { expressionType = CreateErrorType("error"); } if (errorArg != null) { hasError = true; Error(diagnostics, ErrorCode.ERR_AnonymousTypePropertyAssignedBadValue, errorSyntax, errorArg); // NOTE: ERR_QueryRangeVariableAssignedBadValue is being generated // by query binding code and never reach this point } return(expressionType); }
/// <summary> /// Returns the type to be used as a field type; generates errors in case the type is not /// supported for anonymous type fields. /// </summary> private TypeSymbol GetAnonymousTypeFieldType(BoundExpression expression, CSharpSyntaxNode errorSyntax, DiagnosticBag diagnostics, ref bool hasError) { object errorArg = null; TypeSymbol expressionType = expression.Type; if (!expression.HasAnyErrors) { if (expression.HasExpressionType()) { if (expressionType.SpecialType == SpecialType.System_Void) { errorArg = expressionType; expressionType = CreateErrorType(SyntaxFacts.GetText(SyntaxKind.VoidKeyword)); } else if (expressionType.IsUnsafe()) { errorArg = expressionType; // CONSIDER: we could use an explicit error type instead of the unsafe type. } else if (expressionType.IsRestrictedType()) { errorArg = expressionType; } } else { if (expression.Kind == BoundKind.UnboundLambda) { errorArg = ((UnboundLambda)expression).MessageID.Localize(); } else if (expression.Kind == BoundKind.MethodGroup) { errorArg = MessageID.IDS_MethodGroup.Localize(); } else { Debug.Assert(expression.IsLiteralNull(), "How did we successfully bind an expression without a type?"); errorArg = MessageID.IDS_NULL.Localize(); } } } if ((object)expressionType == null) { expressionType = CreateErrorType("error"); } if (errorArg != null) { hasError = true; Error(diagnostics, ErrorCode.ERR_AnonymousTypePropertyAssignedBadValue, errorSyntax, errorArg); // NOTE: ERR_QueryRangeVariableAssignedBadValue is being generated // by query binding code and never reach this point } return expressionType; }
/// <summary> /// Returns the type to be used as a field type; generates errors in case the type is not /// supported for anonymous type fields. /// </summary> private TypeSymbol GetAnonymousTypeFieldType(BoundExpression expression, CSharpSyntaxNode errorSyntax, DiagnosticBag diagnostics, ref bool hasError) { object errorArg = null; TypeSymbol expressionType = expression.Type; if (!expression.HasAnyErrors) { if (expression.HasExpressionType()) { if (expressionType.SpecialType == SpecialType.System_Void) { errorArg = expressionType; expressionType = CreateErrorType(SyntaxFacts.GetText(SyntaxKind.VoidKeyword)); } else if (expressionType.IsUnsafe()) { errorArg = expressionType; // CONSIDER: we could use an explicit error type instead of the unsafe type. } else if (expressionType.IsRestrictedType()) { errorArg = expressionType; } } else { errorArg = expression.Display; } } if ((object)expressionType == null) { expressionType = CreateErrorType("error"); } if (errorArg != null) { hasError = true; Error(diagnostics, ErrorCode.ERR_AnonymousTypePropertyAssignedBadValue, errorSyntax, errorArg); // NOTE: ERR_QueryRangeVariableAssignedBadValue is being generated // by query binding code and never reach this point } return expressionType; }