未验证 提交 20f61171 编写于 作者: F Fred Silberberg 提交者: GitHub

Merge pull request #38056 from 333fred/generate-operations

Add generation for all IOperation nodes
......@@ -696,7 +696,7 @@ public static Conversion GetConversion(this IConversionOperation conversionExpre
{
if (conversionExpression.Language == LanguageNames.CSharp)
{
return (Conversion)((BaseConversionOperation)conversionExpression).ConvertibleConversion;
return (Conversion)((BaseConversionOperation)conversionExpression).ConversionConvertible;
}
else
{
......
......@@ -1387,12 +1387,11 @@ private IPropertyInitializerOperation CreateBoundPropertyEqualsValueOperation(Bo
{
ImmutableArray<IPropertySymbol> initializedProperties = ImmutableArray.Create<IPropertySymbol>(boundPropertyEqualsValue.Property);
BoundNode value = boundPropertyEqualsValue.Value;
OperationKind kind = OperationKind.PropertyInitializer;
SyntaxNode syntax = boundPropertyEqualsValue.Syntax;
ITypeSymbol type = null;
Optional<object> constantValue = default(Optional<object>);
bool isImplicit = boundPropertyEqualsValue.WasCompilerGenerated;
return new CSharpLazyPropertyInitializerOperation(this, value, boundPropertyEqualsValue.Locals.As<ILocalSymbol>(), initializedProperties, kind, _semanticModel, syntax, type, constantValue, isImplicit);
return new CSharpLazyPropertyInitializerOperation(this, value, boundPropertyEqualsValue.Locals.As<ILocalSymbol>(), initializedProperties, _semanticModel, syntax, type, constantValue, isImplicit);
}
private IParameterInitializerOperation CreateBoundParameterEqualsValueOperation(BoundParameterEqualsValue boundParameterEqualsValue)
......@@ -2073,7 +2072,7 @@ internal IOperation CreatePropertySubpatternMember(Symbol symbol, ITypeSymbol ma
var receiver = new InstanceReferenceOperation(
InstanceReferenceKind.PatternInput, _semanticModel, nameSyntax, matchedType, constantValue: default, isImplicit: true);
return new PropertyReferenceOperation(
property, receiver, ImmutableArray<IArgumentOperation>.Empty, _semanticModel, nameSyntax, property.Type,
property, ImmutableArray<IArgumentOperation>.Empty, receiver, _semanticModel, nameSyntax, property.Type,
constantValue: default, isImplicit: isImplicit);
}
default:
......
......@@ -402,8 +402,8 @@ internal static ImmutableArray<BoundNode> CreateInvalidChildrenFromArgumentsExpr
// No matching declaration, synthesize a property reference to be assigned.
target = new PropertyReferenceOperation(
property,
instance,
arguments: ImmutableArray<IArgumentOperation>.Empty,
instance,
semanticModel: _semanticModel,
syntax: value.Syntax,
type: property.Type,
......@@ -414,8 +414,8 @@ internal static ImmutableArray<BoundNode> CreateInvalidChildrenFromArgumentsExpr
else
{
target = new PropertyReferenceOperation(anonymousProperty.Property,
instance,
ImmutableArray<IArgumentOperation>.Empty,
instance,
_semanticModel,
anonymousProperty.Syntax,
anonymousProperty.Type,
......@@ -428,7 +428,7 @@ internal static ImmutableArray<BoundNode> CreateInvalidChildrenFromArgumentsExpr
ITypeSymbol assignmentType = target.Type;
Optional<object> constantValue = value.ConstantValue;
bool isRef = false;
var assignment = new SimpleAssignmentOperation(target, isRef, value, _semanticModel, assignmentSyntax, assignmentType, constantValue, isImplicitAssignment);
var assignment = new SimpleAssignmentOperation(isRef, target, value, _semanticModel, assignmentSyntax, assignmentType, constantValue, isImplicitAssignment);
builder.Add(assignment);
}
......
......@@ -169,7 +169,7 @@ internal sealed class CSharpLazyArrayInitializerOperation : LazyArrayInitializer
private readonly BoundArrayInitialization _arrayInitialization;
internal CSharpLazyArrayInitializerOperation(CSharpOperationFactory operationFactory, BoundArrayInitialization arrayInitialization, SemanticModel semanticModel, SyntaxNode syntax, Optional<object> constantValue, bool isImplicit) :
base(semanticModel, syntax, constantValue, isImplicit)
base(semanticModel, syntax, type: null, constantValue, isImplicit)
{
_operationFactory = operationFactory;
_arrayInitialization = arrayInitialization;
......@@ -531,7 +531,7 @@ internal sealed class CSharpLazyVariableInitializerOperation : LazyVariableIniti
private readonly BoundNode _value;
internal CSharpLazyVariableInitializerOperation(CSharpOperationFactory operationFactory, BoundNode value, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional<object> constantValue, bool isImplicit) :
base(semanticModel, syntax, type, constantValue, isImplicit)
base(locals: ImmutableArray<ILocalSymbol>.Empty, semanticModel, syntax, type, constantValue, isImplicit)
{
_operationFactory = operationFactory;
_value = value;
......@@ -549,7 +549,7 @@ internal sealed class CSharpLazyFieldInitializerOperation : LazyFieldInitializer
private readonly BoundNode _value;
internal CSharpLazyFieldInitializerOperation(CSharpOperationFactory operationFactory, BoundNode value, ImmutableArray<ILocalSymbol> locals, ImmutableArray<IFieldSymbol> initializedFields, OperationKind kind, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional<object> constantValue, bool isImplicit) :
base(locals, initializedFields, kind, semanticModel, syntax, type, constantValue, isImplicit)
base(initializedFields, locals, semanticModel, syntax, type, constantValue, isImplicit)
{
_operationFactory = operationFactory;
_value = value;
......@@ -608,7 +608,7 @@ internal sealed class CSharpLazyForEachLoopOperation : LazyForEachLoopOperation
private readonly BoundForEachStatement _forEachStatement;
internal CSharpLazyForEachLoopOperation(CSharpOperationFactory operationFactory, BoundForEachStatement forEachStatement, ImmutableArray<ILocalSymbol> locals, ILabelSymbol continueLabel, ILabelSymbol exitLabel, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional<object> constantValue, bool isImplicit) :
base(locals, continueLabel, exitLabel, semanticModel, syntax, type, constantValue, isImplicit)
base(LoopKind.ForEach, locals, continueLabel, exitLabel, semanticModel, syntax, type, constantValue, isImplicit)
{
_operationFactory = operationFactory;
_forEachStatement = forEachStatement;
......@@ -679,7 +679,7 @@ internal sealed class CSharpLazyIncrementOrDecrementOperation : LazyIncrementOrD
private readonly BoundNode _target;
internal CSharpLazyIncrementOrDecrementOperation(CSharpOperationFactory operationFactory, BoundNode target, bool isDecrement, bool isPostfix, bool isLifted, bool isChecked, IMethodSymbol operatorMethod, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional<object> constantValue, bool isImplicit) :
base(isDecrement, isPostfix, isLifted, isChecked, operatorMethod, semanticModel, syntax, type, constantValue, isImplicit)
base(isPostfix, isLifted, isChecked, operatorMethod, isDecrement ? OperationKind.Decrement : OperationKind.Increment, semanticModel, syntax, type, constantValue, isImplicit)
{
_operationFactory = operationFactory;
_target = target;
......@@ -1069,7 +1069,7 @@ internal sealed class CSharpLazyParameterInitializerOperation : LazyParameterIni
private readonly BoundNode _value;
internal CSharpLazyParameterInitializerOperation(CSharpOperationFactory operationFactory, BoundNode value, ImmutableArray<ILocalSymbol> locals, IParameterSymbol parameter, OperationKind kind, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional<object> constantValue, bool isImplicit) :
base(locals, parameter, kind, semanticModel, syntax, type, constantValue, isImplicit)
base(parameter, locals, semanticModel, syntax, type, constantValue, isImplicit)
{
_operationFactory = operationFactory;
_value = value;
......@@ -1086,8 +1086,8 @@ internal sealed class CSharpLazyPropertyInitializerOperation : LazyPropertyIniti
private readonly CSharpOperationFactory _operationFactory;
private readonly BoundNode _value;
internal CSharpLazyPropertyInitializerOperation(CSharpOperationFactory operationFactory, BoundNode value, ImmutableArray<ILocalSymbol> locals, ImmutableArray<IPropertySymbol> initializedProperties, OperationKind kind, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional<object> constantValue, bool isImplicit) :
base(locals, initializedProperties, kind, semanticModel, syntax, type, constantValue, isImplicit)
internal CSharpLazyPropertyInitializerOperation(CSharpOperationFactory operationFactory, BoundNode value, ImmutableArray<ILocalSymbol> locals, ImmutableArray<IPropertySymbol> initializedProperties, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional<object> constantValue, bool isImplicit) :
base(initializedProperties, locals, semanticModel, syntax, type, constantValue, isImplicit)
{
_operationFactory = operationFactory;
_value = value;
......@@ -1148,7 +1148,7 @@ internal sealed class CSharpLazySingleValueCaseClauseOperation : LazySingleValue
private readonly BoundNode _value;
internal CSharpLazySingleValueCaseClauseOperation(CSharpOperationFactory operationFactory, BoundNode value, ILabelSymbol label, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional<object> constantValue, bool isImplicit) :
base(label, semanticModel, syntax, type, constantValue, isImplicit)
base(CaseKind.SingleValue, label, semanticModel, syntax, type, constantValue, isImplicit)
{
_operationFactory = operationFactory;
_value = value;
......@@ -1245,7 +1245,7 @@ internal sealed class CSharpLazyTupleOperation : LazyTupleOperation
private readonly BoundTupleExpression _tupleExpression;
internal CSharpLazyTupleOperation(CSharpOperationFactory operationFactory, BoundTupleExpression tupleExpression, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, ITypeSymbol naturalType, Optional<object> constantValue, bool isImplicit) :
base(semanticModel, syntax, type, naturalType, constantValue, isImplicit)
base(naturalType, semanticModel, syntax, type, constantValue, isImplicit)
{
_operationFactory = operationFactory;
_tupleExpression = tupleExpression;
......@@ -1442,7 +1442,7 @@ internal sealed class CSharpLazyWhileLoopOperation : LazyWhileLoopOperation
private readonly BoundConditionalLoopStatement _conditionalLoopStatement;
internal CSharpLazyWhileLoopOperation(CSharpOperationFactory operationFactory, BoundConditionalLoopStatement conditionalLoopStatement, ImmutableArray<ILocalSymbol> locals, ILabelSymbol continueLabel, ILabelSymbol exitLabel, bool conditionIsTop, bool conditionIsUntil, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional<object> constantValue, bool isImplicit) :
base(locals, continueLabel, exitLabel, conditionIsTop, conditionIsUntil, semanticModel, syntax, type, constantValue, isImplicit)
base(conditionIsTop, conditionIsUntil, LoopKind.While, locals, continueLabel, exitLabel, semanticModel, syntax, type, constantValue, isImplicit)
{
_operationFactory = operationFactory;
_conditionalLoopStatement = conditionalLoopStatement;
......@@ -1495,7 +1495,7 @@ internal sealed class CSharpLazyConstantPatternOperation : LazyConstantPatternOp
private readonly BoundNode _value;
internal CSharpLazyConstantPatternOperation(ITypeSymbol inputType, CSharpOperationFactory operationFactory, BoundNode value, SemanticModel semanticModel, SyntaxNode syntax, bool isImplicit) :
base(inputType, semanticModel, syntax, isImplicit)
base(inputType, semanticModel, syntax, type: null, constantValue: default, isImplicit)
{
_operationFactory = operationFactory;
_value = value;
......@@ -1525,18 +1525,20 @@ internal sealed partial class CSharpLazyRecursivePatternOperation : LazyRecursiv
declaredSymbol: boundRecursivePattern.Variable,
semanticModel: semanticModel,
syntax: boundRecursivePattern.Syntax,
type: null,
constantValue: default,
isImplicit: boundRecursivePattern.WasCompilerGenerated)
{
_operationFactory = operationFactory;
_boundRecursivePattern = boundRecursivePattern;
}
public override ImmutableArray<IPatternOperation> CreateDeconstructionSubpatterns()
protected override ImmutableArray<IPatternOperation> CreateDeconstructionSubpatterns()
{
return _boundRecursivePattern.Deconstruction.IsDefault ? ImmutableArray<IPatternOperation>.Empty :
_boundRecursivePattern.Deconstruction.SelectAsArray((p, fac) => (IPatternOperation)fac.Create(p.Pattern), _operationFactory);
}
public override ImmutableArray<IPropertySubpatternOperation> CreatePropertySubpatterns()
protected override ImmutableArray<IPropertySubpatternOperation> CreatePropertySubpatterns()
{
return _boundRecursivePattern.Properties.IsDefault ? ImmutableArray<IPropertySubpatternOperation>.Empty :
_boundRecursivePattern.Properties.SelectAsArray((p, recursivePattern) => recursivePattern._operationFactory.CreatePropertySubpattern(p, recursivePattern.MatchedType), this);
......@@ -1555,18 +1557,18 @@ internal sealed partial class CSharpLazyPropertySubpatternOperation : LazyProper
ITypeSymbol matchedType,
SyntaxNode syntax,
SemanticModel semanticModel)
: base(semanticModel, syntax, isImplicit: false)
: base(semanticModel, syntax, type: null, constantValue: default, isImplicit: false)
{
_subpattern = subpattern;
_operationFactory = operationFactory;
_matchedType = matchedType;
}
public override IOperation CreateMember()
protected override IOperation CreateMember()
{
return _operationFactory.CreatePropertySubpatternMember(_subpattern.Symbol, _matchedType, Syntax);
}
public override IPatternOperation CreatePattern()
protected override IPatternOperation CreatePattern()
{
return (IPatternOperation)_operationFactory.Create(_subpattern.Pattern);
}
......@@ -1587,18 +1589,20 @@ public CSharpLazyITuplePatternOperation(CSharpOperationFactory operationFactory,
declaredSymbol: null,
semanticModel: semanticModel,
syntax: boundITuplePattern.Syntax,
type: null,
constantValue: default,
isImplicit: boundITuplePattern.WasCompilerGenerated)
{
_operationFactory = operationFactory;
_boundITuplePattern = boundITuplePattern;
}
public override ImmutableArray<IPatternOperation> CreateDeconstructionSubpatterns()
protected override ImmutableArray<IPatternOperation> CreateDeconstructionSubpatterns()
{
return _boundITuplePattern.Subpatterns.IsDefault ? ImmutableArray<IPatternOperation>.Empty :
_boundITuplePattern.Subpatterns.SelectAsArray((p, fac) => (IPatternOperation)fac.Create(p.Pattern), _operationFactory);
}
public override ImmutableArray<IPropertySubpatternOperation> CreatePropertySubpatterns()
protected override ImmutableArray<IPropertySubpatternOperation> CreatePropertySubpatterns()
{
return ImmutableArray<IPropertySubpatternOperation>.Empty;
}
......@@ -1656,7 +1660,7 @@ internal sealed class CSharpLazySwitchExpressionOperation : LazySwitchExpression
private readonly BoundSwitchExpression _switchExpression;
public CSharpLazySwitchExpressionOperation(CSharpOperationFactory operationFactory, BoundSwitchExpression boundSwitchExpression, SemanticModel semanticModel)
: base(boundSwitchExpression.Type, semanticModel, boundSwitchExpression.Syntax, boundSwitchExpression.WasCompilerGenerated)
: base(semanticModel, boundSwitchExpression.Syntax, boundSwitchExpression.Type, constantValue: default, boundSwitchExpression.WasCompilerGenerated)
{
_operationFactory = operationFactory;
_switchExpression = boundSwitchExpression;
......@@ -1678,7 +1682,7 @@ internal sealed class CSharpLazySwitchExpressionArmOperation : LazySwitchExpress
private readonly BoundSwitchExpressionArm _switchExpressionArm;
public CSharpLazySwitchExpressionArmOperation(CSharpOperationFactory operationFactory, BoundSwitchExpressionArm boundSwitchExpressionArm, SemanticModel semanticModel)
: base(boundSwitchExpressionArm.Locals.Cast<CSharp.Symbols.LocalSymbol, ILocalSymbol>(), semanticModel, boundSwitchExpressionArm.Syntax, boundSwitchExpressionArm.WasCompilerGenerated)
: base(boundSwitchExpressionArm.Locals.Cast<CSharp.Symbols.LocalSymbol, ILocalSymbol>(), semanticModel, boundSwitchExpressionArm.Syntax, type: null, constantValue: default, boundSwitchExpressionArm.WasCompilerGenerated)
{
_operationFactory = operationFactory;
_switchExpressionArm = boundSwitchExpressionArm;
......@@ -1765,7 +1769,7 @@ internal sealed class CSharpLazyMethodBodyOperation : LazyMethodBodyOperation
private readonly BoundNonConstructorMethodBody _methodBody;
internal CSharpLazyMethodBodyOperation(CSharpOperationFactory operationFactory, BoundNonConstructorMethodBody methodBody, SemanticModel semanticModel, SyntaxNode syntax) :
base(semanticModel, syntax)
base(semanticModel, syntax, type: null, constantValue: default, isImplicit: false)
{
_operationFactory = operationFactory;
_methodBody = methodBody;
......@@ -1788,7 +1792,7 @@ internal sealed class CSharpLazyConstructorBodyOperation : LazyConstructorBodyOp
private readonly BoundConstructorMethodBody _constructorMethodBody;
internal CSharpLazyConstructorBodyOperation(CSharpOperationFactory operationFactory, BoundConstructorMethodBody constructorMethodBody, ImmutableArray<ILocalSymbol> locals, SemanticModel semanticModel, SyntaxNode syntax) :
base(locals, semanticModel, syntax)
base(locals, semanticModel, syntax, type: null, constantValue: default, isImplicit: false)
{
_operationFactory = operationFactory;
_constructorMethodBody = constructorMethodBody;
......@@ -1834,7 +1838,7 @@ internal sealed class CSharpLazyRangeOperation : LazyRangeOperation
private readonly BoundRangeExpression _rangeExpression;
internal CSharpLazyRangeOperation(CSharpOperationFactory operationFactory, BoundRangeExpression rangeExpression, bool isLifted, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, IMethodSymbol symbol, bool isImplicit) :
base(isLifted, semanticModel, syntax, type, symbol, isImplicit)
base(isLifted, symbol, semanticModel, syntax, type, constantValue: default, isImplicit)
{
_operationFactory = operationFactory;
_rangeExpression = rangeExpression;
......
......@@ -160,9 +160,9 @@ private void TestGetFlowGraphInvalidArgumentCore(string argumentExceptionMessage
try
{
IFieldInitializerOperation initializer = new FieldInitializerOperation(
ImmutableArray<ILocalSymbol>.Empty, ImmutableArray<IFieldSymbol>.Empty,
value: null, kind: OperationKind.FieldInitializer,
semanticModel: null, syntax: null, type: null, constantValue: default, isImplicit: false);
ImmutableArray<IFieldSymbol>.Empty, ImmutableArray<ILocalSymbol>.Empty,
value: null, semanticModel: null,
syntax: null, type: null, constantValue: default, isImplicit: false);
initializer = Operation.SetParentOperation(initializer, parent);
_ = ControlFlowGraph.Create(initializer);
}
......@@ -178,9 +178,9 @@ private void TestGetFlowGraphInvalidArgumentCore(string argumentExceptionMessage
try
{
IPropertyInitializerOperation initializer = new PropertyInitializerOperation(
ImmutableArray<ILocalSymbol>.Empty, ImmutableArray<IPropertySymbol>.Empty,
value: null, kind: OperationKind.PropertyInitializer,
semanticModel: null, syntax: null, type: null, constantValue: default, isImplicit: false);
ImmutableArray<IPropertySymbol>.Empty, ImmutableArray<ILocalSymbol>.Empty,
value: null, semanticModel: null,
syntax: null, type: null, constantValue: default, isImplicit: false);
initializer = Operation.SetParentOperation(initializer, parent);
_ = ControlFlowGraph.Create(initializer);
}
......@@ -196,9 +196,9 @@ private void TestGetFlowGraphInvalidArgumentCore(string argumentExceptionMessage
try
{
IParameterInitializerOperation initializer = new ParameterInitializerOperation(
ImmutableArray<ILocalSymbol>.Empty, parameter: null,
value: null, kind: OperationKind.ParameterInitializer,
semanticModel: null, syntax: null, type: null, constantValue: default, isImplicit: false);
parameter: null, locals: ImmutableArray<ILocalSymbol>.Empty,
value: null, semanticModel: null,
syntax: null, type: null, constantValue: default, isImplicit: false);
initializer = Operation.SetParentOperation(initializer, parent);
_ = ControlFlowGraph.Create(initializer);
}
......
......@@ -16,14 +16,22 @@ namespace Microsoft.CodeAnalysis
/// </summary>
internal abstract class Operation : IOperation
{
protected static readonly IOperation s_unset = new EmptyOperation(null, null, null, default, isImplicit: true);
protected static readonly IBlockOperation s_unsetBlock = new BlockOperation(ImmutableArray<IOperation>.Empty, default, null, null, null, default, isImplicit: true);
protected static readonly IArrayInitializerOperation s_unsetArrayInitializer = new ArrayInitializerOperation(ImmutableArray<IOperation>.Empty, null, null, default, isImplicit: true);
protected static readonly IEventReferenceOperation s_unsetEventReference = new EventReferenceOperation(null, null, null, null, null, default, isImplicit: true);
protected static readonly IObjectOrCollectionInitializerOperation s_unsetObjectOrCollectionInitializer = new ObjectOrCollectionInitializerOperation(ImmutableArray<IOperation>.Empty, null, null, null, default, isImplicit: true);
protected static readonly IPatternOperation s_unsetPattern = new ConstantPatternOperation(null, null, null, null, isImplicit: true);
protected static readonly IVariableDeclarationGroupOperation s_unsetVariableDeclarationGroup = new VariableDeclarationGroupOperation(ImmutableArray<IVariableDeclarationOperation>.Empty, null, null, null, default, isImplicit: true);
protected static readonly IVariableInitializerOperation s_unsetVariableInitializer = new VariableInitializerOperation(null, null, null, null, default, isImplicit: true);
protected static readonly IOperation s_unset = new EmptyOperation(
semanticModel: null, syntax: null, type: null, constantValue: default, isImplicit: true);
protected static readonly IBlockOperation s_unsetBlock = new BlockOperation(
operations: ImmutableArray<IOperation>.Empty, locals: default, semanticModel: null, syntax: null, type: null, constantValue: default, isImplicit: true);
protected static readonly IArrayInitializerOperation s_unsetArrayInitializer = new ArrayInitializerOperation(
elementValues: ImmutableArray<IOperation>.Empty, semanticModel: null, syntax: null, type: null, constantValue: default, isImplicit: true);
protected static readonly IEventReferenceOperation s_unsetEventReference = new EventReferenceOperation(
@event: null, instance: null, semanticModel: null, syntax: null, type: null, constantValue: default, isImplicit: true);
protected static readonly IObjectOrCollectionInitializerOperation s_unsetObjectOrCollectionInitializer = new ObjectOrCollectionInitializerOperation(
initializers: ImmutableArray<IOperation>.Empty, semanticModel: null, syntax: null, type: null, constantValue: default, isImplicit: true);
protected static readonly IPatternOperation s_unsetPattern = new ConstantPatternOperation(
value: null, inputType: null, semanticModel: null, syntax: null, type: null, constantValue: default, isImplicit: true);
protected static readonly IVariableDeclarationGroupOperation s_unsetVariableDeclarationGroup = new VariableDeclarationGroupOperation(
declarations: ImmutableArray<IVariableDeclarationOperation>.Empty, semanticModel: null, syntax: null, type: null, constantValue: default, isImplicit: true);
protected static readonly IVariableInitializerOperation s_unsetVariableInitializer = new VariableInitializerOperation(
locals: ImmutableArray<ILocalSymbol>.Empty, value: null, semanticModel: null, syntax: null, type: null, constantValue: default, isImplicit: false);
private readonly SemanticModel _owningSemanticModelOpt;
// this will be lazily initialized. this will be initialized only once
......
......@@ -78,7 +78,7 @@ public override IOperation VisitVariableDeclaration(IVariableDeclarationOperatio
public override IOperation VisitConversion(IConversionOperation operation, object argument)
{
return new ConversionOperation(Visit(operation.Operand), ((BaseConversionOperation)operation).ConvertibleConversion, operation.IsTryCast, operation.IsChecked, ((Operation)operation).OwningSemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
return new ConversionOperation(Visit(operation.Operand), ((BaseConversionOperation)operation).ConversionConvertible, operation.IsTryCast, operation.IsChecked, ((Operation)operation).OwningSemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
}
public override IOperation VisitSwitch(ISwitchOperation operation, object argument)
......@@ -154,7 +154,7 @@ public override IOperation VisitEmpty(IEmptyOperation operation, object argument
public override IOperation VisitReturn(IReturnOperation operation, object argument)
{
return new ReturnOperation(operation.Kind, Visit(operation.ReturnedValue), ((Operation)operation).OwningSemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
return new ReturnOperation(Visit(operation.ReturnedValue), operation.Kind, ((Operation)operation).OwningSemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
}
public override IOperation VisitLock(ILockOperation operation, object argument)
......@@ -257,7 +257,7 @@ public override IOperation VisitMethodReference(IMethodReferenceOperation operat
public override IOperation VisitPropertyReference(IPropertyReferenceOperation operation, object argument)
{
return new PropertyReferenceOperation(operation.Property, Visit(operation.Instance), VisitArray(operation.Arguments), ((Operation)operation).OwningSemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
return new PropertyReferenceOperation(operation.Property, VisitArray(operation.Arguments), Visit(operation.Instance), ((Operation)operation).OwningSemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
}
public override IOperation VisitEventReference(IEventReferenceOperation operation, object argument)
......@@ -292,8 +292,8 @@ public override IOperation VisitUnaryOperator(IUnaryOperation operation, object
public override IOperation VisitBinaryOperator(IBinaryOperation operation, object argument)
{
return new BinaryOperation(operation.OperatorKind, Visit(operation.LeftOperand), Visit(operation.RightOperand), operation.IsLifted,
operation.IsChecked, operation.IsCompareText, operation.OperatorMethod,
return new BinaryOperation(operation.OperatorKind, Visit(operation.LeftOperand), Visit(operation.RightOperand),
operation.IsLifted, operation.IsChecked, operation.IsCompareText, operation.OperatorMethod,
((BaseBinaryOperation)operation).UnaryOperatorMethod, ((Operation)operation).OwningSemanticModel,
operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
}
......@@ -306,7 +306,7 @@ public override IOperation VisitTupleBinaryOperator(ITupleBinaryOperation operat
public override IOperation VisitCompoundAssignment(ICompoundAssignmentOperation operation, object argument)
{
var compoundAssignment = (BaseCompoundAssignmentOperation)operation;
return new CompoundAssignmentOperation(Visit(operation.Target), Visit(operation.Value), compoundAssignment.InConversionConvertible, compoundAssignment.OutConversionConvertible, operation.OperatorKind, operation.IsLifted, operation.IsChecked, operation.OperatorMethod, ((Operation)operation).OwningSemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
return new CompoundAssignmentOperation(compoundAssignment.InConversionConvertible, compoundAssignment.OutConversionConvertible, operation.OperatorKind, operation.IsLifted, operation.IsChecked, operation.OperatorMethod, Visit(operation.Target), Visit(operation.Value), ((Operation)operation).OwningSemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
}
public override IOperation VisitConditional(IConditionalOperation operation, object argument)
......@@ -317,7 +317,7 @@ public override IOperation VisitConditional(IConditionalOperation operation, obj
public override IOperation VisitCoalesce(ICoalesceOperation operation, object argument)
{
var coalesceOperation = (BaseCoalesceOperation)operation;
return new CoalesceOperation(Visit(operation.Value), Visit(operation.WhenNull), coalesceOperation.ConvertibleValueConversion, coalesceOperation.OwningSemanticModel,
return new CoalesceOperation(Visit(operation.Value), Visit(operation.WhenNull), coalesceOperation.ValueConversionConvertible, coalesceOperation.OwningSemanticModel,
operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
}
......@@ -404,7 +404,7 @@ public override IOperation VisitMemberInitializer(IMemberInitializerOperation op
public override IOperation VisitFieldInitializer(IFieldInitializerOperation operation, object argument)
{
return new FieldInitializerOperation(operation.Locals, operation.InitializedFields, Visit(operation.Value), operation.Kind, ((Operation)operation).OwningSemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
return new FieldInitializerOperation(operation.InitializedFields, operation.Locals, Visit(operation.Value), ((Operation)operation).OwningSemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
}
public override IOperation VisitVariableInitializer(IVariableInitializerOperation operation, object argument)
......@@ -414,12 +414,12 @@ public override IOperation VisitVariableInitializer(IVariableInitializerOperatio
public override IOperation VisitPropertyInitializer(IPropertyInitializerOperation operation, object argument)
{
return new PropertyInitializerOperation(operation.Locals, operation.InitializedProperties, Visit(operation.Value), operation.Kind, ((Operation)operation).OwningSemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
return new PropertyInitializerOperation(operation.InitializedProperties, operation.Locals, Visit(operation.Value), ((Operation)operation).OwningSemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
}
public override IOperation VisitParameterInitializer(IParameterInitializerOperation operation, object argument)
{
return new ParameterInitializerOperation(operation.Locals, operation.Parameter, Visit(operation.Value), operation.Kind, ((Operation)operation).OwningSemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
return new ParameterInitializerOperation(operation.Parameter, operation.Locals, Visit(operation.Value), ((Operation)operation).OwningSemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
}
public override IOperation VisitArrayCreation(IArrayCreationOperation operation, object argument)
......@@ -434,7 +434,7 @@ public override IOperation VisitArrayInitializer(IArrayInitializerOperation oper
public override IOperation VisitSimpleAssignment(ISimpleAssignmentOperation operation, object argument)
{
return new SimpleAssignmentOperation(Visit(operation.Target), operation.IsRef, Visit(operation.Value), ((Operation)operation).OwningSemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
return new SimpleAssignmentOperation(operation.IsRef, Visit(operation.Target), Visit(operation.Value), ((Operation)operation).OwningSemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
}
public override IOperation VisitDeconstructionAssignment(IDeconstructionAssignmentOperation operation, object argument)
......@@ -449,8 +449,7 @@ public override IOperation VisitDeclarationExpression(IDeclarationExpressionOper
public override IOperation VisitIncrementOrDecrement(IIncrementOrDecrementOperation operation, object argument)
{
bool isDecrement = operation.Kind == OperationKind.Decrement;
return new IncrementOrDecrementOperation(isDecrement, operation.IsPostfix, operation.IsLifted, operation.IsChecked, Visit(operation.Target), operation.OperatorMethod, ((Operation)operation).OwningSemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
return new IncrementOrDecrementOperation(operation.IsPostfix, operation.IsLifted, operation.IsChecked, Visit(operation.Target), operation.OperatorMethod, operation.Kind, ((Operation)operation).OwningSemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
}
public override IOperation VisitParenthesized(IParenthesizedOperation operation, object argument)
......@@ -573,7 +572,7 @@ public override IOperation VisitPatternCaseClause(IPatternCaseClauseOperation op
public override IOperation VisitTuple(ITupleOperation operation, object argument)
{
return new TupleOperation(VisitArray(operation.Elements), ((Operation)operation).OwningSemanticModel, operation.Syntax, operation.Type, operation.NaturalType, operation.ConstantValue, operation.IsImplicit);
return new TupleOperation(VisitArray(operation.Elements), operation.NaturalType, ((Operation)operation).OwningSemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
}
public override IOperation VisitTranslatedQuery(ITranslatedQueryOperation operation, object argument)
......
......@@ -1581,7 +1581,7 @@ Namespace Microsoft.CodeAnalysis.Operations
Dim type As ITypeSymbol = boundAnonymousTypePropertyAccess.Type
Dim constantValue As [Optional](Of Object) = ConvertToOptional(boundAnonymousTypePropertyAccess.ConstantValueOpt)
Dim isImplicit As Boolean = boundAnonymousTypePropertyAccess.WasCompilerGenerated
Return New PropertyReferenceOperation([property], instance, arguments, _semanticModel, syntax, type, constantValue, isImplicit)
Return New PropertyReferenceOperation([property], arguments, instance, _semanticModel, syntax, type, constantValue, isImplicit)
End Function
Private Function CreateAnonymousTypePropertyAccessImplicitReceiverOperation(propertySym As IPropertySymbol, syntax As SyntaxNode) As InstanceReferenceOperation
......
......@@ -351,8 +351,8 @@ Namespace Microsoft.CodeAnalysis.Operations
Dim instance As IInstanceReferenceOperation = CreateAnonymousTypePropertyAccessImplicitReceiverOperation([property], expression.Syntax)
target = New PropertyReferenceOperation(
[property],
instance,
ImmutableArray(Of IArgumentOperation).Empty,
instance,
_semanticModel,
value.Syntax,
[property].Type,
......@@ -370,7 +370,7 @@ Namespace Microsoft.CodeAnalysis.Operations
Dim syntax As SyntaxNode = If(value.Syntax?.Parent, expression.Syntax)
Dim type As ITypeSymbol = target.Type
Dim constantValue As [Optional](Of Object) = value.ConstantValue
Dim assignment = New SimpleAssignmentOperation(target, isRef, value, _semanticModel, syntax, type, constantValue, isImplicitAssignment)
Dim assignment = New SimpleAssignmentOperation(isRef, target, value, _semanticModel, syntax, type, constantValue, isImplicitAssignment)
builder.Add(assignment)
Next i
......
......@@ -122,7 +122,7 @@ Namespace Microsoft.CodeAnalysis.Operations
Private ReadOnly _arrayInitialization As BoundArrayInitialization
Friend Sub New(operationFactory As VisualBasicOperationFactory, arrayInitialization As BoundArrayInitialization, semanticModel As SemanticModel, syntax As SyntaxNode, constantValue As [Optional](Of Object), isImplicit As Boolean)
MyBase.New(semanticModel, syntax, constantValue, isImplicit)
MyBase.New(semanticModel, syntax, type:=Nothing, constantValue, isImplicit)
_operationFactory = operationFactory
_arrayInitialization = arrayInitialization
End Sub
......@@ -362,7 +362,7 @@ Namespace Microsoft.CodeAnalysis.Operations
Private ReadOnly _value As BoundNode
Friend Sub New(operationFactory As VisualBasicOperationFactory, value As BoundNode, semanticModel As SemanticModel, syntax As SyntaxNode, type As ITypeSymbol, constantValue As [Optional](Of Object), isImplicit As Boolean)
MyBase.New(semanticModel, syntax, type, constantValue, isImplicit)
MyBase.New(locals:=ImmutableArray(Of ILocalSymbol).Empty, semanticModel, syntax, type, constantValue, isImplicit)
_operationFactory = operationFactory
_value = value
End Sub
......@@ -379,7 +379,7 @@ Namespace Microsoft.CodeAnalysis.Operations
Private ReadOnly _value As BoundNode
Friend Sub New(operationFactory As VisualBasicOperationFactory, value As BoundNode, locals As ImmutableArray(Of ILocalSymbol), initializedFields As ImmutableArray(Of IFieldSymbol), kind As OperationKind, semanticModel As SemanticModel, syntax As SyntaxNode, type As ITypeSymbol, constantValue As [Optional](Of Object), isImplicit As Boolean)
MyBase.New(locals, initializedFields, kind, semanticModel, syntax, type, constantValue, isImplicit)
MyBase.New(initializedFields, locals, semanticModel, syntax, type, constantValue, isImplicit)
_operationFactory = operationFactory
_value = value
End Sub
......@@ -413,7 +413,7 @@ Namespace Microsoft.CodeAnalysis.Operations
Private ReadOnly _forEachLoop As BoundForEachStatement
Friend Sub New(operationFactory As VisualBasicOperationFactory, forEachLoop As BoundForEachStatement, locals As ImmutableArray(Of ILocalSymbol), continueLabel As ILabelSymbol, exitLabel As ILabelSymbol, semanticModel As SemanticModel, syntax As SyntaxNode, type As ITypeSymbol, constantValue As [Optional](Of Object), isImplicit As Boolean)
MyBase.New(locals, continueLabel, exitLabel, semanticModel, syntax, type, constantValue, isImplicit)
MyBase.New(LoopKind.ForEach, locals, continueLabel, exitLabel, semanticModel, syntax, type, constantValue, isImplicit)
_operationFactory = operationFactory
_forEachLoop = forEachLoop
End Sub
......@@ -446,7 +446,7 @@ Namespace Microsoft.CodeAnalysis.Operations
Private ReadOnly _boundForToLoop As BoundForToStatement
Friend Sub New(operationFactory As VisualBasicOperationFactory, boundForToLoop As BoundForToStatement, locals As ImmutableArray(Of ILocalSymbol), isChecked As Boolean, info As (LoopObject As ILocalSymbol, UserDefinedInfo As ForToLoopOperationUserDefinedInfo), continueLabel As ILabelSymbol, exitLabel As ILabelSymbol, semanticModel As SemanticModel, syntax As SyntaxNode, type As ITypeSymbol, constantValue As [Optional](Of Object), isImplicit As Boolean)
MyBase.New(locals, isChecked, info, continueLabel, exitLabel, semanticModel, syntax, type, constantValue, isImplicit)
MyBase.New(isChecked, info, LoopKind.ForTo, locals, continueLabel, exitLabel, semanticModel, syntax, type, constantValue, isImplicit)
_operationFactory = operationFactory
_boundForToLoop = boundForToLoop
End Sub
......@@ -806,7 +806,7 @@ _operationFactory.CreateFromArray(Of BoundExpression, IOperation)(_boundForToLoo
Private ReadOnly _value As BoundNode
Friend Sub New(operationFactory As VisualBasicOperationFactory, value As BoundNode, locals As ImmutableArray(Of ILocalSymbol), parameter As IParameterSymbol, kind As OperationKind, semanticModel As SemanticModel, syntax As SyntaxNode, type As ITypeSymbol, constantValue As [Optional](Of Object), isImplicit As Boolean)
MyBase.New(locals, parameter, kind, semanticModel, syntax, type, constantValue, isImplicit)
MyBase.New(parameter, locals, semanticModel, syntax, type, constantValue, isImplicit)
_operationFactory = operationFactory
_value = value
End Sub
......@@ -840,7 +840,7 @@ _operationFactory.CreateFromArray(Of BoundExpression, IOperation)(_boundForToLoo
Private ReadOnly _value As BoundNode
Friend Sub New(operationFactory As VisualBasicOperationFactory, value As BoundNode, locals As ImmutableArray(Of ILocalSymbol), initializedProperties As ImmutableArray(Of IPropertySymbol), kind As OperationKind, semanticModel As SemanticModel, syntax As SyntaxNode, type As ITypeSymbol, constantValue As [Optional](Of Object), isImplicit As Boolean)
MyBase.New(locals, initializedProperties, kind, semanticModel, syntax, type, constantValue, isImplicit)
MyBase.New(initializedProperties, locals, semanticModel, syntax, type, constantValue, isImplicit)
_operationFactory = operationFactory
_value = value
End Sub
......@@ -880,7 +880,7 @@ _operationFactory.CreateFromArray(Of BoundExpression, IOperation)(_boundForToLoo
Private ReadOnly _rangeCaseClause As BoundRangeCaseClause
Friend Sub New(operationFactory As VisualBasicOperationFactory, rangeCaseClause As BoundRangeCaseClause, semanticModel As SemanticModel, syntax As SyntaxNode, type As ITypeSymbol, constantValue As [Optional](Of Object), isImplicit As Boolean)
MyBase.New(semanticModel, syntax, type, constantValue, isImplicit)
MyBase.New(CaseKind.Range, label:=Nothing, semanticModel, syntax, type, constantValue, isImplicit)
_operationFactory = operationFactory
_rangeCaseClause = rangeCaseClause
End Sub
......@@ -901,7 +901,7 @@ _operationFactory.CreateFromArray(Of BoundExpression, IOperation)(_boundForToLoo
Private ReadOnly _value As BoundNode
Friend Sub New(operationFactory As VisualBasicOperationFactory, value As BoundNode, relation As BinaryOperatorKind, semanticModel As SemanticModel, syntax As SyntaxNode, type As ITypeSymbol, constantValue As [Optional](Of Object), isImplicit As Boolean)
MyBase.New(relation, semanticModel, syntax, type, constantValue, isImplicit)
MyBase.New(relation, CaseKind.Relational, label:=Nothing, semanticModel, syntax, type, constantValue, isImplicit)
_operationFactory = operationFactory
_value = value
End Sub
......@@ -935,7 +935,7 @@ _operationFactory.CreateFromArray(Of BoundExpression, IOperation)(_boundForToLoo
Private ReadOnly _value As BoundNode
Friend Sub New(operationFactory As VisualBasicOperationFactory, value As BoundNode, label As ILabelSymbol, semanticModel As SemanticModel, syntax As SyntaxNode, type As ITypeSymbol, constantValue As [Optional](Of Object), isImplicit As Boolean)
MyBase.New(label, semanticModel, syntax, type, constantValue, isImplicit)
MyBase.New(CaseKind.SingleValue, label, semanticModel, syntax, type, constantValue, isImplicit)
_operationFactory = operationFactory
_value = value
End Sub
......@@ -1023,7 +1023,7 @@ _operationFactory.CreateFromArray(Of BoundExpression, IOperation)(_boundForToLoo
Private ReadOnly _tupleExpression As BoundTupleExpression
Friend Sub New(operationFactory As VisualBasicOperationFactory, tupleExpression As BoundTupleExpression, semanticModel As SemanticModel, syntax As SyntaxNode, type As ITypeSymbol, naturalType As ITypeSymbol, constantValue As [Optional](Of Object), isImplicit As Boolean)
MyBase.New(semanticModel, syntax, type, naturalType, constantValue, isImplicit)
MyBase.New(naturalType, semanticModel, syntax, type, constantValue, isImplicit)
_operationFactory = operationFactory
_tupleExpression = tupleExpression
End Sub
......@@ -1133,7 +1133,7 @@ _operationFactory.CreateFromArray(Of BoundExpression, IOperation)(_boundForToLoo
Private ReadOnly _conditionalLoop As IBoundConditionalLoop
Friend Sub New(operationFactory As VisualBasicOperationFactory, conditionalLoop As IBoundConditionalLoop, locals As ImmutableArray(Of ILocalSymbol), continueLabel As ILabelSymbol, exitLabel As ILabelSymbol, conditionIsTop As Boolean, conditionIsUntil As Boolean, semanticModel As SemanticModel, syntax As SyntaxNode, type As ITypeSymbol, constantValue As [Optional](Of Object), isImplicit As Boolean)
MyBase.New(locals, continueLabel, exitLabel, conditionIsTop, conditionIsUntil, semanticModel, syntax, type, constantValue, isImplicit)
MyBase.New(conditionIsTop, conditionIsUntil, LoopKind.While, locals, continueLabel, exitLabel, semanticModel, syntax, type, constantValue, isImplicit)
_operationFactory = operationFactory
_conditionalLoop = conditionalLoop
End Sub
......
......@@ -1374,7 +1374,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
<Extension>
Public Function GetConversion(conversionExpression As IConversionOperation) As Conversion
If conversionExpression.Language = LanguageNames.VisualBasic Then
Return DirectCast(DirectCast(conversionExpression, BaseConversionOperation).ConvertibleConversion, Conversion)
Return DirectCast(DirectCast(conversionExpression, BaseConversionOperation).ConversionConvertible, Conversion)
Else
Throw New ArgumentException(String.Format(VBResources.IConversionExpressionIsNotVisualBasicConversion,
NameOf(IConversionOperation)),
......
......@@ -1137,7 +1137,7 @@ public override void VisitConversion(IConversionOperation operation)
{
LogNewLine();
Indent();
LogString($"({((BaseConversionOperation)operation).ConvertibleConversion})");
LogString($"({((BaseConversionOperation)operation).ConversionConvertible})");
Unindent();
}
......@@ -1173,7 +1173,7 @@ public override void VisitCoalesce(ICoalesceOperation operation)
LogConversion(operation.ValueConversion, "ValueConversion");
LogNewLine();
Indent();
LogString($"({((BaseCoalesceOperation)operation).ConvertibleValueConversion})");
LogString($"({((BaseCoalesceOperation)operation).ValueConversionConvertible})");
Unindent();
LogNewLine();
Unindent();
......
// 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;
using System.Linq;
namespace IOperationGenerator
{
internal sealed partial class IOperationClassWriter
{
private bool ModelHasErrors(Tree tree)
{
bool error = false;
foreach (var abstractNode in tree.Types.OfType<AbstractNode>())
{
if (!abstractNode.Name.StartsWith("I"))
{
Console.WriteLine($"All IOperation node names must start with I. {abstractNode.Name} does not.");
error = true;
}
if (!abstractNode.Name.EndsWith("Operation"))
{
Console.WriteLine($"All IOperation node names must end with Operation. {abstractNode.Name} does not.");
error = true;
}
if (!_typeMap.ContainsKey(abstractNode.Base))
{
Console.WriteLine($"{abstractNode.Name}'s base type is not an IOperation type.");
error = true;
}
if (!abstractNode.IsInternal && abstractNode.Obsolete is null)
{
if (abstractNode.Comments?.Elements?[0].Name != "summary")
{
Console.WriteLine($"{abstractNode.Name} does not have correctly formatted comments, please ensure that there is a <summary> block for the type.");
error = true;
}
foreach (var prop in abstractNode.Properties)
{
if (prop.Comments?.Elements?[0].Name != "summary" && !prop.IsInternal)
{
Console.WriteLine($"{abstractNode.Name}.{prop.Name} does not have correctly formatted comments, please ensure that there is a <summary> block for the property.");
error = true;
}
}
}
if (!(abstractNode is Node node)) continue;
if (node.SkipChildrenGeneration || node.SkipClassGeneration) continue;
var properties = GetAllGeneratedIOperationProperties(node).Where(p => !p.IsInternal).Select(p => p.Name).ToList();
if (properties.Count < 2)
{
if (node.ChildrenOrder is string order)
{
var splitOrder = GetPropertyOrder(node);
if (splitOrder.Count != properties.Count || (properties.Count == 1 && properties[0] != splitOrder[0]))
{
Console.WriteLine($"{node.Name} has inconsistent ChildrenOrder and properties");
error = true;
}
}
continue;
}
if (node.ChildrenOrder is null)
{
Console.WriteLine($"{node.Name} has more than 1 IOperation property and must declare an explicit ordering with the ChildrenOrder attribute.");
Console.WriteLine($"Properties: {string.Join(", ", properties)}");
error = true;
continue;
}
var childrenOrdered = GetPropertyOrder(node);
foreach (var child in childrenOrdered)
{
if (!properties.Remove(child))
{
Console.WriteLine($"{node.Name}'s ChildrenOrder contains unknown property {child}");
error = true;
}
}
foreach (var remainingProp in properties)
{
Console.WriteLine($"{node.Name}'s ChildrenOrder is missing {remainingProp}");
error = true;
}
}
return error;
}
}
}
......@@ -66,9 +66,16 @@ public class Node : AbstractNode
public string? VisitorName;
[XmlAttribute(AttributeName = "SkipInVisitor")]
public string SkipInVisitorText;
public string? SkipInVisitorText;
public bool SkipInVisitor => SkipInVisitorText == "true";
[XmlAttribute(AttributeName = "SkipChildrenGeneration")]
public string? SkipChildrenGenerationText;
public bool SkipChildrenGeneration => SkipChildrenGenerationText == "true";
[XmlAttribute]
public string? ChildrenOrder;
public override bool IsAbstract => false;
}
......@@ -90,6 +97,14 @@ public class Property
public string NewText;
public bool IsNew => NewText == "true";
[XmlAttribute(AttributeName = "Internal")]
public string? IsInternalText;
public bool IsInternal => IsInternalText == "true";
[XmlAttribute(AttributeName = "SkipGeneration")]
public string? SkipGenerationText;
public bool SkipGeneration => SkipGenerationText == "true";
[XmlElement(ElementName = "Comments", Type = typeof(Comments))]
public Comments? Comments;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册