/// <summary> /// コンストラクタ /// </summary> /// <param name="operation">IOperationインスタンス</param> /// <param name="container">イベントコンテナ</param> public Invocation(IInvocationOperation operation, EventContainer container) : base(container) { if (operation.Instance is null) { // 組み込み・クラスメンバ var nameSpace = $"{operation.TargetMethod.ContainingNamespace.Name}."; var className = $"{operation.TargetMethod.ContainingType}".Replace(nameSpace, string.Empty, System.StringComparison.CurrentCulture); Expressions.Add(new Expression(className, string.Empty)); } else { // インスタンス var isLiteralOrBinary = false; if (operation.Instance is ILiteralOperation || operation.Instance is IBinaryOperation) { isLiteralOrBinary = true; } var syntax = operation.Syntax as InvocationExpressionSyntax; if (isLiteralOrBinary && syntax.ArgumentList != null) { Expressions.Add(new Expression(syntax.ArgumentList.OpenParenToken.Text, string.Empty)); } Expressions.AddRange(OperationFactory.GetExpressionList(operation.Instance, container)); if (isLiteralOrBinary && syntax.ArgumentList != null) { Expressions.Add(new Expression(syntax.ArgumentList.CloseParenToken.Text, string.Empty)); } } Expressions.Add(new Expression(".", string.Empty)); // メソッドがローカルメソッドの場合はクリアする if (operation.TargetMethod.MethodKind == MethodKind.LocalFunction) { Expressions.Clear(); } // メソッド名 Expressions.Add(new Expression(operation.TargetMethod.Name, operation.TargetMethod.MethodKind.ToString())); // メソッドパラメータ Expressions.Add(new Expression("(", string.Empty)); var isFirst = true; foreach (var arg in operation.Arguments) { if (!isFirst) { Expressions.Add(new Expression(",", string.Empty)); } Expressions.AddRange(OperationFactory.GetExpressionList(arg.Value, container)); isFirst = false; } Expressions.Add(new Expression(")", string.Empty)); }
public void ParseBody() { var blocks = new Blocks(Method).MethodBlocks.GetAllBlocks(); foreach (var blockAnalyzer in blocks.Select(block => new BlockAnalyzer(block))) { Expressions.AddRange(blockAnalyzer.GenerateExpressions()); } }
internal SqlClientArray(Type clrType, ProviderType sqlType, SqlExpression[] exprs, Expression sourceExpression) : base(SqlNodeType.ClientArray, clrType, sqlType, sourceExpression) { expressions = new List <SqlExpression>(); if (exprs != null) { Expressions.AddRange(exprs); } }
/// <summary> /// コンストラクタ /// </summary> /// <param name="operation">IOperationインスタンス</param> /// <param name="container">イベントコンテナ</param> public VariableDeclarator(IVariableDeclaratorOperation operation, EventContainer container) : base(container) { Expressions.Add(new Expression(operation.Symbol.Name, Expression.GetSymbolTypeName(operation.Symbol))); if (!(operation.Initializer is null)) { Expressions.Add(new Expression("=", string.Empty)); Expressions.AddRange(OperationFactory.GetExpressionList(operation.Initializer.Value, container)); } }
/// <summary> /// コンストラクタ /// </summary> /// <param name="operation">IOperationインスタンス</param> /// <param name="container">イベントコンテナ</param> public ArrayInitializer(IArrayInitializerOperation operation, EventContainer container) : base(container) { // 初期化要素 Expressions.Add(new Expression("[", string.Empty)); foreach (var element in operation.ElementValues) { Expressions.AddRange(OperationFactory.GetExpressionList(element, eventContainer)); if (element != operation.ElementValues.Last()) { Expressions.Add(new Expression(",", string.Empty)); } } Expressions.Add(new Expression("]", string.Empty)); }
/// <summary> /// コンストラクタ /// </summary> /// <param name="operation">IOperationインスタンス</param> /// <param name="container">イベントコンテナ</param> public IsType(IIsTypeOperation operation, EventContainer container) : base(container) { var name = Expression.GetSymbolName(operation.TypeOperand, true); var type = Expression.GetSymbolTypeName(operation.TypeOperand); if (operation.TypeOperand.TypeKind == TypeKind.Class) { // 外部ファイル参照イベント発行 RaiseOtherFileReferenced(operation.Syntax, operation.TypeOperand); } Expressions.AddRange(OperationFactory.GetExpressionList(operation.ValueOperand, container)); Expressions.Add(new Expression("is", "")); Expressions.Add(new Expression(name, type)); }
/// <summary> /// コンストラクタ /// </summary> /// <param name="operation">IOperationインスタンス</param> /// <param name="container">イベントコンテナ</param> public Binary(IBinaryOperation operation, EventContainer container) : base(container) { // 左辺 OpenParentheses(operation.LeftOperand); Expressions.AddRange(OperationFactory.GetExpressionList(operation.LeftOperand, container)); CloseParentheses(operation.LeftOperand); // 演算子 Expressions.AddRange(Expression.GetOperationKindExpression(operation)); // 右辺 OpenParentheses(operation.RightOperand); Expressions.AddRange(OperationFactory.GetExpressionList(operation.RightOperand, container)); CloseParentheses(operation.RightOperand); }
/// <summary> /// コンストラクタ /// </summary> /// <param name="operation">IOperationインスタンス</param> /// <param name="container">イベントコンテナ</param> public ArrayElementReference(IArrayElementReferenceOperation operation, EventContainer container) : base(container) { // 型名 Expressions.AddRange(OperationFactory.GetExpressionList(operation.ArrayReference, container)); // 要素取得 Expressions.Add(new Expression("[", string.Empty)); for (var i = 0; i < operation.Indices.Length; i++) { Expressions.AddRange(OperationFactory.GetExpressionList(operation.Indices[i], container)); if (i >= 0 && i < operation.Indices.Length - 1) { Expressions.Add(new Expression(",", string.Empty)); } } Expressions.Add(new Expression("]", string.Empty)); }
/// <summary> /// コンストラクタ /// </summary> /// <param name="operation">IOperationインスタンス</param> /// <param name="container">イベントコンテナ</param> public Increment(IIncrementOrDecrementOperation operation, EventContainer container) : base(container) { var incrementOrDecrement = Expression.GetOperationKindExpression(operation); if (!operation.IsPostfix) { // インクリメント・デクリメント Expressions.AddRange(incrementOrDecrement); } // インクリメント・デクリメント対象インスタンス Expressions.AddRange(OperationFactory.GetExpressionList(operation.Target, container)); if (operation.IsPostfix) { // インクリメント・デクリメント Expressions.AddRange(incrementOrDecrement); } }
/// <summary> /// プロパティ参照情報を追加する /// </summary> /// <param name="operation">IOperationインスタンス</param> /// <returns>追加した場合はtrue nullの場合はfalse</returns> private bool AddExpressions(IOperation operation) { // operationがnullの場合はfalseを返して終了 if (operation == null) { return(false); } // プロパティ参照情報の追加 if (operation is IPropertyReferenceOperation prop) { if (prop.Property.IsStatic) { Expressions.Add(new Expression(prop.Property.ContainingSymbol.Name, Expression.GetSymbolTypeName(prop.Property.ContainingSymbol))); Expressions.Add(new Expression(".", string.Empty)); // 外部参照チェック if (prop.Property.ContainingSymbol is INamedTypeSymbol) { // 外部ファイル参照イベント発行 RaiseOtherFileReferenced(prop.Syntax, prop.Property.ContainingSymbol); } } // インスタンスプロパティの場合はthisを追加する if (prop.Instance is IInstanceReferenceOperation) { Expressions.AddRange(OperationFactory.GetExpressionList(prop.Instance, eventContainer)); Expressions.Add(new Expression(".", string.Empty)); } // プロパティ格納 SetProperty(prop); } else { Expressions.AddRange(OperationFactory.GetExpressionList(operation, eventContainer)); } return(true); }
/// <summary> /// コンストラクタ /// </summary> /// <param name="operation">IOperationインスタンス</param> /// <param name="container">イベントコンテナ</param> public ArrayCreation(IArrayCreationOperation operation, EventContainer container) : base(container) { // newキーワード追加 Expressions.Add(new Expression("new", NewKeywordTypeName)); // 型 var arrayTypeSymbol = operation.Type as IArrayTypeSymbol; var parts = arrayTypeSymbol?.ElementType.ToDisplayParts(SymbolDisplayFormat.MinimallyQualifiedFormat); foreach (var part in parts) { // スペースの場合は型設定に含めない if (part.Kind == SymbolDisplayPartKind.Space) { continue; } var name = Expression.GetSymbolName(part, true); var type = Expression.GetSymbolTypeName(part.Symbol); if (part.Kind == SymbolDisplayPartKind.ClassName) { // 外部ファイル参照イベント発行 RaiseOtherFileReferenced(operation.Syntax, part.Symbol); } Expressions.Add(new Expression(name, type)); } // 要素取得 Expressions.Add(new Expression("[", string.Empty)); for (var i = 0; i < operation.DimensionSizes.Length; i++) { Expressions.AddRange(OperationFactory.GetExpressionList(operation.DimensionSizes[i], container)); if (i >= 0 && i < operation.DimensionSizes.Length - 1) { Expressions.Add(new Expression(",", string.Empty)); } } Expressions.Add(new Expression("]", string.Empty)); }
/// <summary> /// プロパティ格納 /// </summary> /// <param name="prop">親プロパティ</param> private void SetProperty(IPropertyReferenceOperation prop) { if (prop.Property is IPropertySymbol propItem) { if (propItem.IsIndexer) { // インデクサの場合 Expressions.AddRange(OperationFactory.GetExpressionList(prop.Instance, eventContainer)); Expressions.Add(new Expression("[", string.Empty)); foreach (var arg in prop.Arguments) { if (!arg.Equals(prop.Arguments.First())) { Expressions.Add(new Expression(",", string.Empty)); } Expressions.AddRange(OperationFactory.GetExpressionList(arg, eventContainer)); } Expressions.Add(new Expression("]", string.Empty)); } else { // ローカルの場合はインスタンスを追加する if (prop.Instance is ILocalReferenceOperation) { Expressions.AddRange(OperationFactory.GetExpressionList(prop.Instance, eventContainer)); Expressions.Add(new Expression(".", string.Empty)); } // それ以外のプロパティの場合 Expressions.Add(new Expression(propItem.Name, Expression.GetSymbolTypeName(propItem))); } } else { // プロパティ以外の場合 Expressions.Add(new Expression(prop.Property.Name, Expression.GetSymbolTypeName(prop.Property))); } }
/// <summary> /// コンストラクタ /// </summary> /// <param name="operation">IOperationインスタンス</param> /// <param name="container">イベントコンテナ</param> public SimpleAssignment(ISimpleAssignmentOperation operation, EventContainer container) : base(container) { Expressions.AddRange(OperationFactory.GetExpressionList(operation.Target, container)); Expressions.Add(new Expression("=", string.Empty)); Expressions.AddRange(OperationFactory.GetExpressionList(operation.Value, container)); }
/// <summary> /// コンストラクタ /// </summary> /// <param name="operation">IOperationインスタンス</param> /// <param name="container">イベントコンテナ</param> public ObjectCreation(IObjectCreationOperation operation, EventContainer container) : base(container) { var node = operation.Syntax; var parts = operation.Type.ToDisplayParts(SymbolDisplayFormat.MinimallyQualifiedFormat); if (!parts.Any()) { return; } // newキーワード追加 Expressions.Add(new Expression("new", NewKeywordTypeName)); // クラス生成 foreach (var part in parts) { // スペースの場合は型設定に含めない if (part.Kind == SymbolDisplayPartKind.Space) { continue; } var name = Expression.GetSymbolName(part, true); var type = Expression.GetSymbolTypeName(part.Symbol); if (part.Kind == SymbolDisplayPartKind.ClassName) { // 外部ファイル参照イベント発行 RaiseOtherFileReferenced(node, part.Symbol); } Expressions.Add(new Expression(name, type)); } // パラメーター取得 Expressions.Add(new Expression("(", string.Empty)); var isFirst = true; foreach (var param in operation.Arguments) { if (!isFirst) { Expressions.Add(new Expression(",", string.Empty)); } Expressions.AddRange(OperationFactory.GetExpressionList(param, container)); isFirst = false; } Expressions.Add(new Expression(")", string.Empty)); // 初期値を追加 if (operation.Initializer != null) { isFirst = true; Expressions.Add(new Expression("{", string.Empty)); foreach (var intializer in operation.Initializer.Initializers) { if (!isFirst) { Expressions.Add(new Expression(",", string.Empty)); } switch (intializer) { case IInvocationOperation op: if (op.Arguments.Count() > 1) { Expressions.Add(new Expression("{", string.Empty)); } foreach (var arg in op.Arguments) { if (op.Arguments.IndexOf(arg) > 0) { Expressions.Add(new Expression(",", string.Empty)); } Expressions.AddRange(OperationFactory.GetExpressionList(arg, container)); } if (op.Arguments.Count() > 1) { Expressions.Add(new Expression("}", string.Empty)); } break; default: Expressions.AddRange(OperationFactory.GetExpressionList(intializer, container)); break; } isFirst = false; } Expressions.Add(new Expression("}", string.Empty)); } }
/// <summary> /// コンストラクタ /// </summary> /// <param name="operation">IOperationインスタンス</param> /// <param name="container">イベントコンテナ</param> public IsPattern(IIsPatternOperation operation, EventContainer container) : base(container) { Expressions.AddRange(OperationFactory.GetExpressionList(operation.Value, container)); Expressions.Add(new Expression("is", "")); Expressions.AddRange(OperationFactory.GetExpressionList(operation.Pattern, container)); }
/// <summary> /// コンストラクタ /// </summary> /// <param name="operation">IOperationインスタンス</param> /// <param name="container">イベントコンテナ</param> public Argument(IArgumentOperation operation, EventContainer container) : base(container) { Expressions.AddRange(OperationFactory.GetExpressionList(operation.Value, container)); }
/// <summary> /// コンストラクタ /// </summary> /// <param name="operation">IOperationインスタンス</param> /// <param name="container">イベントコンテナ</param> public CompoundAssignment(ICompoundAssignmentOperation operation, EventContainer container) : base(container) { // 対象インスタンス Expressions.AddRange(OperationFactory.GetExpressionList(operation.Target, container)); var operatorName = string.Empty; switch (operation.OperatorKind) { case BinaryOperatorKind.Add: operatorName = "+"; break; case BinaryOperatorKind.Subtract: operatorName = "-"; break; case BinaryOperatorKind.Multiply: operatorName = "*"; break; case BinaryOperatorKind.Divide: operatorName = "/"; break; case BinaryOperatorKind.And: operatorName = "&&"; break; case BinaryOperatorKind.ConditionalAnd: operatorName = "&"; break; case BinaryOperatorKind.ConditionalOr: operatorName = "|"; break; case BinaryOperatorKind.Equals: operatorName = "=="; break; case BinaryOperatorKind.ExclusiveOr: operatorName = "^"; break; case BinaryOperatorKind.GreaterThan: operatorName = ">"; break; case BinaryOperatorKind.GreaterThanOrEqual: operatorName = ">="; break; case BinaryOperatorKind.LessThan: operatorName = "<"; break; case BinaryOperatorKind.LessThanOrEqual: operatorName = "<="; break; case BinaryOperatorKind.NotEquals: operatorName = "!="; break; case BinaryOperatorKind.Or: operatorName = "||"; break; } if (!string.IsNullOrEmpty(operatorName)) { Expressions.Add(new Expression($"{operatorName}=", string.Empty)); } // 値 Expressions.AddRange(OperationFactory.GetExpressionList(operation.Value, container)); }