提交 bd37636e 编写于 作者: H Heejae Chang

addressed some feedback on IsInvalid and some other decision we made on design meeting.

IsInvalid -> HasDiagnostics
removed HasChildren interface and merged it to IOperation
上级 f93b36b3
......@@ -1885,7 +1885,7 @@ public static void Verify(IOperation operation, Compilation compilation, SyntaxN
public override void VisitPropertyReferenceExpression(IPropertyReferenceExpression operation)
{
if (operation.IsInvalid(_compilation) || operation.ArgumentsInEvaluationOrder.Length == 0)
if (operation.HasDiagnostics(_compilation) || operation.ArgumentsInEvaluationOrder.Length == 0)
{
return;
}
......@@ -1894,7 +1894,7 @@ public override void VisitPropertyReferenceExpression(IPropertyReferenceExpressi
var indexerSymbol = operation.Property;
foreach (var argument in operation.ArgumentsInEvaluationOrder)
{
if (!argument.IsInvalid(_compilation))
if (!argument.HasDiagnostics(_compilation))
{
Assert.Same(indexerSymbol, argument.Parameter.ContainingSymbol);
}
......
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using Microsoft.CodeAnalysis.Semantics;
......@@ -35,6 +36,11 @@ public interface IOperation
/// </summary>
Optional<object> ConstantValue { get; }
/// <summary>
/// An array of child operations for this operation.
/// </summary>
IEnumerable<IOperation> Children { get; }
void Accept(OperationVisitor visitor);
TResult Accept<TArgument, TResult>(OperationVisitor<TArgument, TResult> visitor, TArgument argument);
......
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.Collections.Generic;
using System.Runtime.CompilerServices;
namespace Microsoft.CodeAnalysis
{
/// <summary>
/// Root type for <see cref="IOperation"/> nodes that are still not fully designed and hence need a backdoor to stitch the child IOperation nodes to the entire IOperation tree.
/// </summary>
/// <remarks>
/// NOTE: This type is a temporary workaround and should be deleted once we ship IOperation APIs.
/// </remarks>
[InternalImplementationOnly]
internal interface IOperationWithChildren: IOperation
{
/// <summary>
/// An array of child operations for this operation.
/// </summary>
/// <remarks>Note that any of the child operation nodes may be null.</remarks>
IEnumerable<IOperation> Children { get; }
}
}
......@@ -10,7 +10,7 @@ namespace Microsoft.CodeAnalysis
/// <summary>
/// Root type for representing the abstract semantics of C# and VB statements and expressions.
/// </summary>
internal abstract class Operation : IOperation, IOperationWithChildren
internal abstract class Operation : IOperation
{
public Operation(OperationKind kind, SyntaxNode syntax, ITypeSymbol type, Optional<object> constantValue)
{
......@@ -51,7 +51,7 @@ public static IOperation CreateOperationNone(SyntaxNode node, Optional<object> c
return new NoneOperation(node, constantValue, getChildren);
}
private class NoneOperation : IOperation, IOperationWithChildren
private class NoneOperation : IOperation
{
private readonly Func<ImmutableArray<IOperation>> _getChildren;
......
......@@ -14,7 +14,7 @@ public static class OperationExtensions
/// <summary>
/// This will check whether context around the operation has any error such as syntax or semantic error
/// </summary>
public static bool IsInvalid(this IOperation operation, Compilation compilation, CancellationToken cancellationToken = default(CancellationToken))
public static bool HasDiagnostics(this IOperation operation, Compilation compilation, CancellationToken cancellationToken = default(CancellationToken))
{
// once we made sure every operation has Syntax, we will remove this condition
if (operation.Syntax == null)
......@@ -24,7 +24,7 @@ public static bool IsInvalid(this IOperation operation, Compilation compilation,
// if wrong compilation is given, GetSemanticModel will throw due to tree not belong to the given compilation.
var model = compilation.GetSemanticModel(operation.Syntax.SyntaxTree);
return model.GetDiagnostics(operation.Syntax.Span, cancellationToken).Any(d => d.Severity == DiagnosticSeverity.Error);
return model.GetDiagnostics(operation.Syntax.Span, cancellationToken).Any(d => d.DefaultSeverity == DiagnosticSeverity.Error);
}
public static IEnumerable<IOperation> Descendants(this IOperation operation)
......
......@@ -12,9 +12,9 @@ public abstract class OperationWalker : OperationVisitor
{
private int _recursionDepth;
internal void VisitArray<T>(IEnumerable<T> list) where T : IOperation
internal void VisitArray<T>(IEnumerable<T> operations) where T : IOperation
{
foreach (var operation in list)
foreach (var operation in operations)
{
Visit(operation);
}
......@@ -39,18 +39,12 @@ public override void Visit(IOperation operation)
public override void DefaultVisit(IOperation operation)
{
if (operation is IOperationWithChildren operationWithChildren)
{
VisitArray(operationWithChildren.Children);
}
VisitArray(operation.Children);
}
internal override void VisitNoneOperation(IOperation operation)
{
if (operation is IOperationWithChildren operationWithChildren)
{
VisitArray(operationWithChildren.Children);
}
VisitArray(operation.Children);
}
}
}
*REMOVED*Microsoft.CodeAnalysis.Compilation.Emit(System.IO.Stream peStream, System.IO.Stream pdbStream = null, System.IO.Stream xmlDocumentationStream = null, System.IO.Stream win32Resources = null, System.Collections.Generic.IEnumerable<Microsoft.CodeAnalysis.ResourceDescription> manifestResources = null, Microsoft.CodeAnalysis.Emit.EmitOptions options = null, Microsoft.CodeAnalysis.IMethodSymbol debugEntryPoint = null, System.IO.Stream sourceLinkStream = null, System.Collections.Generic.IEnumerable<Microsoft.CodeAnalysis.EmbeddedText> embeddedTexts = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> Microsoft.CodeAnalysis.Emit.EmitResult
*REMOVED*Microsoft.CodeAnalysis.Emit.EmitOptions.EmitOptions(bool metadataOnly = false, Microsoft.CodeAnalysis.Emit.DebugInformationFormat debugInformationFormat = (Microsoft.CodeAnalysis.Emit.DebugInformationFormat)0, string pdbFilePath = null, string outputNameOverride = null, int fileAlignment = 0, ulong baseAddress = 0, bool highEntropyVirtualAddressSpace = false, Microsoft.CodeAnalysis.SubsystemVersion subsystemVersion = default(Microsoft.CodeAnalysis.SubsystemVersion), string runtimeMetadataVersion = null, bool tolerateErrors = false, bool includePrivateMembers = false, System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.Emit.InstrumentationKind> instrumentationKinds = default(System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.Emit.InstrumentationKind>)) -> void
*REMOVED*Microsoft.CodeAnalysis.IOperation.IsInvalid.get -> bool
*REMOVED*Microsoft.CodeAnalysis.Semantics.IPropertyReferenceExpression.Property.get -> Microsoft.CodeAnalysis.IPropertySymbol
Microsoft.CodeAnalysis.IOperation.Children.get -> System.Collections.Generic.IEnumerable<Microsoft.CodeAnalysis.IOperation>
Microsoft.CodeAnalysis.CommandLineArguments.DisplayLangVersions.get -> bool
Microsoft.CodeAnalysis.CommandLineArguments.OutputRefFilePath.get -> string
Microsoft.CodeAnalysis.CommandLineArguments.RuleSetPath.get -> string
......@@ -738,7 +738,7 @@ static Microsoft.CodeAnalysis.Semantics.OperationExtensions.Descendants(this Mic
static Microsoft.CodeAnalysis.Semantics.OperationExtensions.DescendantsAndSelf(this Microsoft.CodeAnalysis.IOperation operation) -> System.Collections.Generic.IEnumerable<Microsoft.CodeAnalysis.IOperation>
static Microsoft.CodeAnalysis.Semantics.OperationExtensions.GetDeclaredVariables(this Microsoft.CodeAnalysis.Semantics.IVariableDeclarationStatement declarationStatement) -> System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.ILocalSymbol>
static Microsoft.CodeAnalysis.Semantics.OperationExtensions.GetRootOperation(this Microsoft.CodeAnalysis.ISymbol symbol, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> Microsoft.CodeAnalysis.IOperation
static Microsoft.CodeAnalysis.Semantics.OperationExtensions.IsInvalid(this Microsoft.CodeAnalysis.IOperation operation, Microsoft.CodeAnalysis.Compilation compilation, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> bool
static Microsoft.CodeAnalysis.Semantics.OperationExtensions.HasDiagnostics(this Microsoft.CodeAnalysis.IOperation operation, Microsoft.CodeAnalysis.Compilation compilation, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> bool
static Microsoft.CodeAnalysis.Semantics.UnaryAndBinaryOperationExtensions.GetBinaryOperandsKind(Microsoft.CodeAnalysis.Semantics.BinaryOperationKind kind) -> Microsoft.CodeAnalysis.Semantics.BinaryOperandsKind
static Microsoft.CodeAnalysis.Semantics.UnaryAndBinaryOperationExtensions.GetBinaryOperandsKind(this Microsoft.CodeAnalysis.Semantics.IBinaryOperatorExpression binary) -> Microsoft.CodeAnalysis.Semantics.BinaryOperandsKind
static Microsoft.CodeAnalysis.Semantics.UnaryAndBinaryOperationExtensions.GetBinaryOperandsKind(this Microsoft.CodeAnalysis.Semantics.ICompoundAssignmentExpression compoundAssignment) -> Microsoft.CodeAnalysis.Semantics.BinaryOperandsKind
......
......@@ -82,7 +82,7 @@ private void LogCommonPropertiesAndNewLine(IOperation operation)
}
// IsInvalid
if (operation.IsInvalid(_compilation))
if (operation.HasDiagnostics(_compilation))
{
LogString(", IsInvalid");
}
......@@ -260,13 +260,10 @@ internal override void VisitNoneOperation(IOperation operation)
LogString("IOperation: ");
LogCommonPropertiesAndNewLine(operation);
if (operation is IOperationWithChildren operationWithChildren)
var children = operation.Children;
if (children.Count() > 0)
{
var children = operationWithChildren.Children.WhereNotNull().ToImmutableArray();
if (children.Length > 0)
{
VisitArray(children, "Children", logElementCount: true);
}
VisitArray(children, "Children", logElementCount: true);
}
}
......
......@@ -63,7 +63,7 @@ public sealed override void Initialize(AnalysisContext context)
context.RegisterOperationAction(
(operationContext) =>
{
if (operationContext.Operation.IsInvalid(operationContext.Compilation, operationContext.CancellationToken))
if (operationContext.Operation.HasDiagnostics(operationContext.Compilation, operationContext.CancellationToken))
{
operationContext.ReportDiagnostic(Diagnostic.Create(IsInvalidDescriptor, operationContext.Operation.Syntax.GetLocation()));
}
......@@ -555,7 +555,7 @@ public sealed override void Initialize(AnalysisContext context)
long priorArgumentValue = long.MinValue;
foreach (IArgument argument in invocation.ArgumentsInEvaluationOrder)
{
if (argument.IsInvalid(operationContext.Compilation, operationContext.CancellationToken))
if (argument.HasDiagnostics(operationContext.Compilation, operationContext.CancellationToken))
{
operationContext.ReportDiagnostic(Diagnostic.Create(InvalidArgumentDescriptor, argument.Syntax.GetLocation()));
return;
......@@ -859,7 +859,7 @@ public sealed override void Initialize(AnalysisContext context)
foreach (var decl in declarationStatement.Declarations)
{
if (decl.Initializer != null && !decl.Initializer.IsInvalid(operationContext.Compilation, operationContext.CancellationToken))
if (decl.Initializer != null && !decl.Initializer.HasDiagnostics(operationContext.Compilation, operationContext.CancellationToken))
{
foreach (var symbol in decl.Variables)
{
......@@ -924,7 +924,7 @@ public sealed override void Initialize(AnalysisContext context)
break;
case OperationKind.SwitchCase:
var switchSection = (ISwitchCase)operationContext.Operation;
if (!switchSection.IsInvalid(operationContext.Compilation, operationContext.CancellationToken) && switchSection.Clauses.Length > 1)
if (!switchSection.HasDiagnostics(operationContext.Compilation, operationContext.CancellationToken) && switchSection.Clauses.Length > 1)
{
Report(operationContext, switchSection.Syntax, MultipleCaseClausesDescriptor);
}
......@@ -1062,7 +1062,7 @@ public sealed override void Initialize(AnalysisContext context)
if (eventAssignment.Event == null)
{
if (eventAssignment.EventInstance == null && eventAssignment.IsInvalid(operationContext.Compilation, operationContext.CancellationToken))
if (eventAssignment.EventInstance == null && eventAssignment.HasDiagnostics(operationContext.Compilation, operationContext.CancellationToken))
{
// report inside after checking for null to make sure it does't crash.
operationContext.ReportDiagnostic(Diagnostic.Create(InvalidEventDescriptor, eventAssignment.Syntax.GetLocation()));
......@@ -1286,7 +1286,7 @@ public sealed override void Initialize(AnalysisContext context)
var addressOfOperation = (IAddressOfExpression)operationContext.Operation;
operationContext.ReportDiagnostic(Diagnostic.Create(AddressOfDescriptor, addressOfOperation.Syntax.GetLocation()));
if (addressOfOperation.Reference.Kind == OperationKind.InvalidExpression && addressOfOperation.IsInvalid(operationContext.Compilation, operationContext.CancellationToken))
if (addressOfOperation.Reference.Kind == OperationKind.InvalidExpression && addressOfOperation.HasDiagnostics(operationContext.Compilation, operationContext.CancellationToken))
{
operationContext.ReportDiagnostic(Diagnostic.Create(InvalidAddressOfReferenceDescriptor, addressOfOperation.Reference.Syntax.GetLocation()));
}
......@@ -1674,8 +1674,8 @@ public sealed override void Initialize(AnalysisContext context)
var binary = (IBinaryOperatorExpression)operationContext.Operation;
var left = binary.LeftOperand;
var right = binary.RightOperand;
if (!left.IsInvalid(operationContext.Compilation, operationContext.CancellationToken) &&
!right.IsInvalid(operationContext.Compilation, operationContext.CancellationToken) &&
if (!left.HasDiagnostics(operationContext.Compilation, operationContext.CancellationToken) &&
!right.HasDiagnostics(operationContext.Compilation, operationContext.CancellationToken) &&
!binary.UsesOperatorMethod && binary.OperatorMethod == null)
{
if (left.Kind == OperationKind.LocalReferenceExpression)
......@@ -1710,7 +1710,7 @@ public sealed override void Initialize(AnalysisContext context)
var operandLocal = ((ILocalReferenceExpression)operand).Local;
if (operandLocal.Name == "x")
{
if (!operand.IsInvalid(operationContext.Compilation, operationContext.CancellationToken) && !unary.UsesOperatorMethod && unary.OperatorMethod == null)
if (!operand.HasDiagnostics(operationContext.Compilation, operationContext.CancellationToken) && !unary.UsesOperatorMethod && unary.OperatorMethod == null)
{
operationContext.ReportDiagnostic(
Diagnostic.Create(UnaryOperatorDescriptor,
......@@ -1852,7 +1852,7 @@ public sealed override void Initialize(AnalysisContext context)
if (operation.Kind == OperationKind.BinaryOperatorExpression)
{
var binary = (IBinaryOperatorExpression)operation;
if (binary.IsInvalid(operationContext.Compilation, operationContext.CancellationToken) && binary.BinaryOperationKind == BinaryOperationKind.Invalid)
if (binary.HasDiagnostics(operationContext.Compilation, operationContext.CancellationToken) && binary.BinaryOperationKind == BinaryOperationKind.Invalid)
{
operationContext.ReportDiagnostic(Diagnostic.Create(InvalidBinaryDescriptor, binary.Syntax.GetLocation()));
}
......@@ -1860,7 +1860,7 @@ public sealed override void Initialize(AnalysisContext context)
else if (operation.Kind == OperationKind.UnaryOperatorExpression)
{
var unary = (IUnaryOperatorExpression)operation;
if (unary.IsInvalid(operationContext.Compilation, operationContext.CancellationToken) && unary.UnaryOperationKind == UnaryOperationKind.Invalid)
if (unary.HasDiagnostics(operationContext.Compilation, operationContext.CancellationToken) && unary.UnaryOperationKind == UnaryOperationKind.Invalid)
{
operationContext.ReportDiagnostic(Diagnostic.Create(InvalidUnaryDescriptor, unary.Syntax.GetLocation()));
}
......@@ -1869,7 +1869,7 @@ public sealed override void Initialize(AnalysisContext context)
{
var inc = (IIncrementExpression)operation;
var binaryOperationKind = CSharpOperationFactory.Helper.DeriveBinaryOperationKind(inc.IncrementOperationKind);
if (inc.IsInvalid(operationContext.Compilation) && binaryOperationKind == BinaryOperationKind.Invalid)
if (inc.HasDiagnostics(operationContext.Compilation) && binaryOperationKind == BinaryOperationKind.Invalid)
{
operationContext.ReportDiagnostic(Diagnostic.Create(InvalidIncrementDescriptor, inc.Syntax.GetLocation()));
}
......@@ -1960,7 +1960,7 @@ public sealed override void Initialize(AnalysisContext context)
var conversion = (IConversionExpression)operationContext.Operation;
if (conversion.ConversionKind == ConversionKind.Invalid)
{
Debug.Assert(conversion.IsInvalid(operationContext.Compilation, operationContext.CancellationToken) == true);
Debug.Assert(conversion.HasDiagnostics(operationContext.Compilation, operationContext.CancellationToken) == true);
operationContext.ReportDiagnostic(Diagnostic.Create(InvalidConversionExpressionDescriptor, conversion.Syntax.GetLocation()));
}
},
......@@ -1996,7 +1996,7 @@ public sealed override void Initialize(AnalysisContext context)
IForLoopStatement forLoop = (IForLoopStatement)loop;
var forCondition = forLoop.Condition;
if (forCondition.IsInvalid(operationContext.Compilation, operationContext.CancellationToken))
if (forCondition.HasDiagnostics(operationContext.Compilation, operationContext.CancellationToken))
{
// Generate a warning to prove we didn't crash
operationContext.ReportDiagnostic(Diagnostic.Create(ForLoopConditionCrashDescriptor, forLoop.Condition.Syntax.GetLocation()));
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册