本文整理汇总了C#中ITypeSymbol.EnsureCSharpSymbolOrNull方法的典型用法代码示例。如果您正苦于以下问题:C# ITypeSymbol.EnsureCSharpSymbolOrNull方法的具体用法?C# ITypeSymbol.EnsureCSharpSymbolOrNull怎么用?C# ITypeSymbol.EnsureCSharpSymbolOrNull使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类ITypeSymbol
的用法示例。
在下文中一共展示了ITypeSymbol.EnsureCSharpSymbolOrNull方法的6个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: CommonCreatePointerTypeSymbol
protected override IPointerTypeSymbol CommonCreatePointerTypeSymbol(ITypeSymbol elementType)
{
return CreatePointerTypeSymbol(elementType.EnsureCSharpSymbolOrNull<ITypeSymbol, TypeSymbol>("elementType"));
}
示例2: CommonCreateArrayTypeSymbol
protected override IArrayTypeSymbol CommonCreateArrayTypeSymbol(ITypeSymbol elementType, int rank)
{
return CreateArrayTypeSymbol(elementType.EnsureCSharpSymbolOrNull<ITypeSymbol, TypeSymbol>("elementType"), rank);
}
示例3: ClassifyConversion
// NOTE(cyrusn): There is a bit of a discoverability problem with this method and the same
// named method in SyntaxTreeSemanticModel. Technically, i believe these are the appropriate
// locations for these methods. This method has no dependencies on anything but the
// compilation, while the other method needs a bindings object to determine what bound node
// an expression syntax binds to. Perhaps when we document these methods we should explain
// where a user can find the other.
public Conversion ClassifyConversion(ITypeSymbol source, ITypeSymbol destination)
{
using (Logger.LogBlock(FunctionId.CSharp_Compilation_ClassifyConversion, message: this.AssemblyName))
{
// Note that it is possible for there to be both an implicit user-defined conversion
// and an explicit built-in conversion from source to destination. In that scenario
// this method returns the implicit conversion.
if ((object)source == null)
{
throw new ArgumentNullException("source");
}
if ((object)destination == null)
{
throw new ArgumentNullException("destination");
}
var cssource = source.EnsureCSharpSymbolOrNull<ITypeSymbol, TypeSymbol>("source");
var csdest = destination.EnsureCSharpSymbolOrNull<ITypeSymbol, TypeSymbol>("destination");
HashSet<DiagnosticInfo> useSiteDiagnostics = null;
return Conversions.ClassifyConversion(cssource, csdest, ref useSiteDiagnostics);
}
}
示例4: ClassifyConversion
public override Conversion ClassifyConversion(ExpressionSyntax expression, ITypeSymbol destination, bool isExplicitInSource = false)
{
var csdestination = destination.EnsureCSharpSymbolOrNull<ITypeSymbol, TypeSymbol>("destination");
if (isExplicitInSource)
{
return ClassifyConversionForCast(expression, csdestination);
}
CheckSyntaxNode(expression);
if ((object)destination == null)
{
throw new ArgumentNullException(nameof(destination));
}
// TODO(cyrusn): Check arguments. This is a public entrypoint, so we must do appropriate
// checks here. However, no other methods in this type do any checking currently. So I'm
// going to hold off on this until we do a full sweep of the API.
var model = this.GetMemberModel(expression);
if (model == null)
{
// 'expression' must just be reference to a type or namespace name outside of an
// expression context. Currently we bail in that case. However, is this a question
// that a client would be asking and would expect sensible results for?
return Conversion.NoConversion;
}
return model.ClassifyConversion(expression, destination);
}
示例5: ClassifyConversion
public override Conversion ClassifyConversion(
ExpressionSyntax expression,
ITypeSymbol destination,
bool isExplicitInSource = false)
{
if ((object)destination == null)
{
throw new ArgumentNullException(nameof(destination));
}
var csdestination = destination.EnsureCSharpSymbolOrNull<ITypeSymbol, TypeSymbol>("destination");
// Special Case: We have to treat anonymous functions differently, because of the way
// they are cached in the syntax-to-bound node map. Specifically, UnboundLambda nodes
// never appear in the map - they are converted to BoundLambdas, even in error scenarios.
// Since a BoundLambda has a type, we would end up doing a conversion from the delegate
// type, rather than from the anonymous function expression. If we use the overload that
// takes a position, it considers the request speculative and does not use the map.
// Bonus: Since the other overload will always bind the anonymous function from scratch,
// we don't have to worry about it affecting the trial-binding cache in the "real"
// UnboundLambda node (DevDiv #854548).
if (expression.IsAnonymousFunction())
{
CheckSyntaxNode(expression);
return this.ClassifyConversion(expression.SpanStart, expression, destination, isExplicitInSource);
}
if (isExplicitInSource)
{
return ClassifyConversionForCast(expression, csdestination);
}
// Note that it is possible for an expression to be convertible to a type
// via both an implicit user-defined conversion and an explicit built-in conversion.
// In that case, this method chooses the implicit conversion.
CheckSyntaxNode(expression);
var binder = this.GetEnclosingBinder(expression, GetAdjustedNodePosition(expression));
CSharpSyntaxNode bindableNode = this.GetBindableSyntaxNode(expression);
var boundExpression = this.GetLowerBoundNode(bindableNode) as BoundExpression;
if (binder == null || boundExpression == null)
{
return Conversion.NoConversion;
}
HashSet<DiagnosticInfo> useSiteDiagnostics = null;
return binder.Conversions.ClassifyConversionFromExpression(boundExpression, csdestination, ref useSiteDiagnostics);
}
示例6: ClassifyConversion
/// <summary>
/// Determines what type of conversion, if any, would be used if a given expression was
/// converted to a given type. If isExplicitInSource is true, the conversion produced is
/// that which would be used if the conversion were done for a cast expression.
/// </summary>
/// <param name="position">The character position for determining the enclosing declaration
/// scope and accessibility.</param>
/// <param name="expression">The expression to classify. This expression does not need to be
/// present in the syntax tree associated with this object.</param>
/// <param name="destination">The type to attempt conversion to.</param>
/// <param name="isExplicitInSource">True if the conversion should be determined as for a cast expression.</param>
/// <returns>Returns a Conversion object that summarizes whether the conversion was
/// possible, and if so, what kind of conversion it was. If no conversion was possible, a
/// Conversion object with a false "Exists" property is returned.</returns>
/// <remarks>To determine the conversion between two types (instead of an expression and a
/// type), use Compilation.ClassifyConversion.</remarks>
public Conversion ClassifyConversion(int position, ExpressionSyntax expression, ITypeSymbol destination, bool isExplicitInSource = false)
{
if ((object)destination == null)
{
throw new ArgumentNullException(nameof(destination));
}
var cdestination = destination.EnsureCSharpSymbolOrNull<ITypeSymbol, TypeSymbol>("destination");
if (isExplicitInSource)
{
return ClassifyConversionForCast(position, expression, cdestination);
}
// Note that it is possible for an expression to be convertible to a type
// via both an implicit user-defined conversion and an explicit built-in conversion.
// In that case, this method chooses the implicit conversion.
position = CheckAndAdjustPosition(position);
var binder = this.GetEnclosingBinder(position);
if (binder != null)
{
var diagnostics = DiagnosticBag.GetInstance();
var bnode = binder.BindExpression(expression, diagnostics);
diagnostics.Free();
if (bnode != null && !cdestination.IsErrorType())
{
HashSet<DiagnosticInfo> useSiteDiagnostics = null;
return binder.Conversions.ClassifyConversionFromExpression(bnode, cdestination, ref useSiteDiagnostics);
}
}
return Conversion.NoConversion;
}