/// <summary> /// コンストラクタ /// </summary> /// <param name="node">対象Node</param> /// <param name="semanticModel">対象ソースのsemanticModel</param> /// <param name="parent">親IAnalyzeItem</param> /// <param name="container">イベントコンテナ</param> public ItemProperty(PropertyDeclarationSyntax node, SemanticModel semanticModel, IAnalyzeItem parent, EventContainer container) : base(parent, node, semanticModel, container) { ItemType = ItemTypes.Property; var declaredSymbol = semanticModel.GetDeclaredSymbol(node); // プロパティの型設定 var parts = ((IPropertySymbol)declaredSymbol).Type.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(node, part.Symbol); } PropertyTypes.Add(new Expression(name, type)); } // アクセサ設定 if (node.AccessorList is null) { AccessorList.Add(ItemFactory.Create(node.ExpressionBody, semanticModel, container, this)); } else { AccessorList.AddRange(node.AccessorList.Accessors.Select(accessor => ItemFactory.Create(accessor, semanticModel, container, this))); } // デフォルト設定 if (node.Initializer == null) { return; } var propertyInitializer = semanticModel.GetOperation(node.Initializer.Value); DefaultValues.AddRange(OperationFactory.GetExpressionList(propertyInitializer, container)); }
/// <summary> /// コンストラクタ /// </summary> /// <param name="node">対象Node</param> /// <param name="semanticModel">対象ソースのsemanticModel</param> /// <param name="parent">親IAnalyzeItem</param> /// <param name="container">イベントコンテナ</param> public ItemStatementLocalDeclaration(LocalDeclarationStatementSyntax node, SemanticModel semanticModel, IAnalyzeItem parent, EventContainer container) : base(parent, node, semanticModel, container) { ItemType = ItemTypes.MethodStatement; var declaredSymbol = semanticModel.GetDeclaredSymbol(node.Declaration.Variables.First()); // 型推論 IsVar = node.Declaration.Type.IsVar; // 型設定 var parts = ((ILocalSymbol)declaredSymbol).Type.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(node, part.Symbol); } Types.Add(new Expression(name, type)); } // デフォルト設定 var constantValue = node.Declaration.Variables.FirstOrDefault(); if (constantValue?.Initializer == null) { return; } var initializer = semanticModel.GetOperation(constantValue.Initializer.Value); DefaultValues.AddRange(OperationFactory.GetExpressionList(initializer, container)); }