本文整理汇总了C#中Microsoft.CodeAnalysis.CSharp.Binder.BindValue方法的典型用法代码示例。如果您正苦于以下问题:C# Binder.BindValue方法的具体用法?C# Binder.BindValue怎么用?C# Binder.BindValue使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Microsoft.CodeAnalysis.CSharp.Binder
的用法示例。
在下文中一共展示了Binder.BindValue方法的6个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: BindTargetExpression
protected BoundExpression BindTargetExpression(DiagnosticBag diagnostics, Binder originalBinder)
{
if (_lazyExpressionAndDiagnostics == null)
{
// Filter out method group in conversion.
DiagnosticBag expressionDiagnostics = DiagnosticBag.GetInstance();
BoundExpression boundExpression = originalBinder.BindValue(TargetExpressionSyntax, expressionDiagnostics, Binder.BindValueKind.RValueOrMethodGroup);
Interlocked.CompareExchange(ref _lazyExpressionAndDiagnostics, new ExpressionAndDiagnostics(boundExpression, expressionDiagnostics.ToReadOnlyAndFree()), null);
}
Debug.Assert(_lazyExpressionAndDiagnostics != null);
if (diagnostics != null)
{
diagnostics.AddRange(_lazyExpressionAndDiagnostics.Diagnostics);
}
return _lazyExpressionAndDiagnostics.Expression;
}
示例2: BindGotoCaseOrDefault
internal BoundStatement BindGotoCaseOrDefault(GotoStatementSyntax node, Binder gotoBinder, DiagnosticBag diagnostics)
{
Debug.Assert(node.Kind() == SyntaxKind.GotoCaseStatement || node.Kind() == SyntaxKind.GotoDefaultStatement);
BoundExpression gotoCaseExpressionOpt = null;
// Prevent cascading diagnostics
if (!node.HasErrors)
{
ConstantValue gotoCaseExpressionConstant = null;
bool hasErrors = false;
SourceLabelSymbol matchedLabelSymbol;
// SPEC: If the goto case statement is not enclosed by a switch statement, if the constant-expression
// SPEC: is not implicitly convertible (§6.1) to the governing type of the nearest enclosing switch statement,
// SPEC: or if the nearest enclosing switch statement does not contain a case label with the given constant value,
// SPEC: a compile-time error occurs.
// SPEC: If the goto default statement is not enclosed by a switch statement, or if the nearest enclosing
// SPEC: switch statement does not contain a default label, a compile-time error occurs.
if (node.Expression != null)
{
Debug.Assert(node.Kind() == SyntaxKind.GotoCaseStatement);
// Bind the goto case expression
gotoCaseExpressionOpt = gotoBinder.BindValue(node.Expression, diagnostics, BindValueKind.RValue);
gotoCaseExpressionOpt = ConvertCaseExpression(node, gotoCaseExpressionOpt, gotoBinder,
ref gotoCaseExpressionConstant, diagnostics, isGotoCaseExpr: true);
// Check for bind errors
hasErrors = hasErrors || gotoCaseExpressionOpt.HasAnyErrors;
if (!hasErrors && gotoCaseExpressionConstant == null)
{
diagnostics.Add(ErrorCode.ERR_ConstantExpected, node.Location);
hasErrors = true;
}
// LabelSymbols for all the switch case labels are created by BuildLabels().
// Fetch the matching switch case label symbols
matchedLabelSymbol = FindMatchingSwitchCaseLabel(gotoCaseExpressionConstant, node);
}
else
{
Debug.Assert(node.Kind() == SyntaxKind.GotoDefaultStatement);
matchedLabelSymbol = GetDefaultLabel();
}
if ((object)matchedLabelSymbol == null)
{
if (!hasErrors)
{
// No matching case label/default label found
var labelName = SyntaxFacts.GetText(node.CaseOrDefaultKeyword.Kind());
if (node.Kind() == SyntaxKind.GotoCaseStatement)
{
labelName += " " + gotoCaseExpressionConstant.Value?.ToString();
}
labelName += ":";
diagnostics.Add(ErrorCode.ERR_LabelNotFound, node.Location, labelName);
hasErrors = true;
}
}
else
{
return new BoundGotoStatement(node, matchedLabelSymbol, gotoCaseExpressionOpt, null, hasErrors);
}
}
return new BoundBadStatement(
syntax: node,
childBoundNodes: gotoCaseExpressionOpt != null ? ImmutableArray.Create<BoundNode>(gotoCaseExpressionOpt) : ImmutableArray<BoundNode>.Empty,
hasErrors: true);
}
示例3: BindSwitchSectionLabel
private BoundSwitchLabel BindSwitchSectionLabel(SwitchLabelSyntax node, Binder sectionBinder, LabelSymbol label, DiagnosticBag diagnostics)
{
var switchGoverningType = SwitchGoverningType;
BoundExpression boundLabelExpressionOpt = null;
ConstantValue labelExpressionConstant = null;
// Prevent cascading diagnostics
bool hasErrors = node.HasErrors;
switch (node.Kind())
{
case SyntaxKind.CaseSwitchLabel:
var caseLabelSyntax = (CaseSwitchLabelSyntax)node;
// Bind the label case expression
boundLabelExpressionOpt = sectionBinder.BindValue(caseLabelSyntax.Value, diagnostics, BindValueKind.RValue);
boundLabelExpressionOpt = ConvertCaseExpression(caseLabelSyntax, boundLabelExpressionOpt, sectionBinder, ref labelExpressionConstant, diagnostics);
// Check for bind errors
hasErrors = hasErrors || boundLabelExpressionOpt.HasAnyErrors;
// SPEC: The constant expression of each case label must denote a value that
// SPEC: is implicitly convertible (§6.1) to the governing type of the switch statement.
if (!hasErrors && labelExpressionConstant == null)
{
diagnostics.Add(ErrorCode.ERR_ConstantExpected, caseLabelSyntax.Value.Location);
hasErrors = true;
}
if (!hasErrors && (object)labelExpressionConstant != null && FindMatchingSwitchCaseLabel(labelExpressionConstant, caseLabelSyntax) != label)
{
diagnostics.Add(ErrorCode.ERR_DuplicateCaseLabel, node.Location, labelExpressionConstant?.GetValueToDisplay() ?? label.Name);
hasErrors = true;
}
// LabelSymbols for all the switch case labels are created by BuildLabels().
// Fetch the matching switch case label symbols
break;
case SyntaxKind.CasePatternSwitchLabel:
if (!node.HasErrors)
{
// This should not occur, because it would have been a syntax error
throw ExceptionUtilities.UnexpectedValue(node.Kind());
}
break;
case SyntaxKind.DefaultSwitchLabel:
if (GetDefaultLabel() != label)
{
diagnostics.Add(ErrorCode.ERR_DuplicateCaseLabel, node.Location, label.Name);
hasErrors = true;
}
break;
default:
throw ExceptionUtilities.UnexpectedValue(node.Kind());
}
return new BoundSwitchLabel(
syntax: node,
label: label,
expressionOpt: boundLabelExpressionOpt,
constantValueOpt: labelExpressionConstant,
hasErrors: hasErrors);
}
示例4: BuildSwitchLabels
private void BuildSwitchLabels(SyntaxList<SwitchLabelSyntax> labelsSyntax, Binder sectionBinder, ArrayBuilder<LabelSymbol> labels, DiagnosticBag tempDiagnosticBag)
{
// add switch case/default labels
foreach (var labelSyntax in labelsSyntax)
{
ConstantValue boundLabelConstantOpt = null;
switch (labelSyntax.Kind())
{
case SyntaxKind.CaseSwitchLabel:
// compute the constant value to place in the label symbol
var caseLabel = (CaseSwitchLabelSyntax)labelSyntax;
Debug.Assert(caseLabel.Value != null);
var boundLabelExpression = sectionBinder.BindValue(caseLabel.Value, tempDiagnosticBag, BindValueKind.RValue);
boundLabelExpression = ConvertCaseExpression(labelSyntax, boundLabelExpression, sectionBinder, ref boundLabelConstantOpt, tempDiagnosticBag);
break;
default:
// No constant value
break;
}
// Create the label symbol
labels.Add(new SourceLabelSymbol((MethodSymbol)this.ContainingMemberOrLambda, labelSyntax, boundLabelConstantOpt));
}
}
示例5: BindSwitchSectionLabel
private BoundSwitchLabel BindSwitchSectionLabel(SwitchLabelSyntax node, Binder sectionBinder, DiagnosticBag diagnostics)
{
var switchGoverningType = GetSwitchGoverningType(diagnostics);
BoundExpression boundLabelExpressionOpt = null;
SourceLabelSymbol boundLabelSymbol = null;
ConstantValue labelExpressionConstant = null;
List<SourceLabelSymbol> matchedLabelSymbols;
// Prevent cascading diagnostics
bool hasErrors = node.HasErrors;
switch (node.Kind())
{
case SyntaxKind.CaseSwitchLabel:
var caseLabelSyntax = (CaseSwitchLabelSyntax)node;
// Bind the label case expression
boundLabelExpressionOpt = sectionBinder.BindValue(caseLabelSyntax.Value, diagnostics, BindValueKind.RValue);
boundLabelExpressionOpt = ConvertCaseExpression(switchGoverningType, caseLabelSyntax, boundLabelExpressionOpt, sectionBinder, ref labelExpressionConstant, diagnostics);
// Check for bind errors
hasErrors = hasErrors || boundLabelExpressionOpt.HasAnyErrors;
// SPEC: The constant expression of each case label must denote a value that
// SPEC: is implicitly convertible (§6.1) to the governing type of the switch statement.
// Prevent cascading diagnostics
if (!hasErrors && labelExpressionConstant == null)
{
diagnostics.Add(ErrorCode.ERR_ConstantExpected, caseLabelSyntax.Location);
hasErrors = true;
}
// LabelSymbols for all the switch case labels are created by BuildLabels().
// Fetch the matching switch case label symbols
matchedLabelSymbols = FindMatchingSwitchCaseLabels(labelExpressionConstant, caseLabelSyntax);
break;
case SyntaxKind.CasePatternSwitchLabel:
// pattern matching in case is not yet implemented.
if (!node.HasErrors)
{
Error(diagnostics, ErrorCode.ERR_FeatureIsUnimplemented, node, MessageID.IDS_FeaturePatternMatching.Localize());
hasErrors = true;
}
matchedLabelSymbols = new List<SourceLabelSymbol>();
break;
case SyntaxKind.DefaultSwitchLabel:
matchedLabelSymbols = GetDefaultLabels();
break;
default:
throw ExceptionUtilities.Unreachable;
}
// Get the corresponding matching label symbol created during BuildLabels()
// and also check for duplicate case labels.
Debug.Assert(hasErrors || !matchedLabelSymbols.IsEmpty());
bool first = true;
bool hasDuplicateErrors = false;
foreach (SourceLabelSymbol label in matchedLabelSymbols)
{
if (node.Equals(label.IdentifierNodeOrToken.AsNode()))
{
// we must have exactly one matching label created during BuildLabels()
boundLabelSymbol = label;
// SPEC: A compile-time error occurs if two or more case labels
// SPEC: in the same switch statement specify the same constant value.
if (!hasErrors && !first)
{
// Skipping the first label symbol ensures that the errors (if any),
// are reported on all but the first duplicate case label.
diagnostics.Add(ErrorCode.ERR_DuplicateCaseLabel, node.Location,
label.SwitchCaseLabelConstant?.Value ?? label.Name);
hasDuplicateErrors = true;
}
break;
}
first = false;
}
if ((object)boundLabelSymbol == null)
{
Debug.Assert(hasErrors);
boundLabelSymbol = new SourceLabelSymbol((MethodSymbol)this.ContainingMemberOrLambda, node, labelExpressionConstant);
}
return new BoundSwitchLabel(
syntax: node,
label: boundLabelSymbol,
expressionOpt: boundLabelExpressionOpt,
hasErrors: hasErrors || hasDuplicateErrors);
}
示例6: BuildSwitchLabels
private void BuildSwitchLabels(SyntaxList<SwitchLabelSyntax> labelsSyntax, Binder sectionBinder, ref ArrayBuilder<LabelSymbol> labels)
{
TypeSymbol switchGoverningType = null;
// add switch case/default labels
foreach (var labelSyntax in labelsSyntax)
{
ConstantValue boundLabelConstantOpt = null;
switch (labelSyntax.Kind())
{
case SyntaxKind.CaseSwitchLabel:
// Bind the switch expression and the switch case label expression, but do not report any diagnostics here.
// Diagnostics will be reported during binding.
var caseLabel = (CaseSwitchLabelSyntax)labelSyntax;
Debug.Assert(caseLabel.Value != null);
DiagnosticBag tempDiagnosticBag = DiagnosticBag.GetInstance();
var boundLabelExpression = sectionBinder.BindValue(caseLabel.Value, tempDiagnosticBag, BindValueKind.RValue);
if ((object)switchGoverningType == null)
{
switchGoverningType = this.BindSwitchExpression(_switchSyntax.Expression, this, tempDiagnosticBag).Type;
}
boundLabelExpression = ConvertCaseExpression(switchGoverningType, labelSyntax, boundLabelExpression, sectionBinder, ref boundLabelConstantOpt, tempDiagnosticBag);
tempDiagnosticBag.Free();
break;
case SyntaxKind.DefaultSwitchLabel:
break;
case SyntaxKind.CasePatternSwitchLabel:
throw new NotImplementedException();
default:
throw ExceptionUtilities.UnexpectedValue(labelSyntax.Kind());
}
if (labels == null)
{
labels = ArrayBuilder<LabelSymbol>.GetInstance();
}
// Create the label symbol
labels.Add(new SourceLabelSymbol((MethodSymbol)this.ContainingMemberOrLambda, labelSyntax, boundLabelConstantOpt));
}
}