void CheckType(AstType simpleType, AstType arg)
            {
                if (arg == null || nullType.IsMatch(arg))
                {
                    return;
                }
                var rr = ctx.Resolve(simpleType);

                if (rr == null || rr.IsError || rr.Type.Namespace != "System" || rr.Type.Name != "Nullable")
                {
                    return;
                }

                AddIssue(new CodeIssue(
                             simpleType,
                             string.Format(ctx.TranslateString("Type can be simplified to '{0}?'"), arg),
                             string.Format(ctx.TranslateString("Rewrite to '{0}?'"), arg),
                             script => {
                    script.Replace(simpleType, arg.Clone().MakeNullableType());
                }
                             ));
            }
        public IEnumerable <CodeAction> GetActions(RefactoringContext context)
        {
            //TODO: implement variable assignment & ctor param
            var varInit = context.GetNode <VariableInitializer>();

            if (varInit != null)
            {
                AstType type = varInit.GetPrevNode() as AstType;
                if (type == null)
                {
                    yield break;
                }
                if (varInit.Parent is FieldDeclaration)
                {
                    yield break;
                }
                if (CannotExtractField(context, varInit))
                {
                    yield break;
                }

                yield return(new CodeAction(context.TranslateString("Assign to new field"), s => {
                    var name = varInit.Name;

                    AstType extractedType;
                    if (type.IsMatch(varType))
                    {
                        IType resolvedType = context.Resolve(varInit.Initializer).Type;
                        extractedType = context.CreateShortType(resolvedType);
                    }
                    else
                    {
                        extractedType = (AstType)type.Clone();
                    }

                    AstNode entityDeclarationNode = varInit.Parent;
                    while (!(entityDeclarationNode is EntityDeclaration) || (entityDeclarationNode is Accessor))
                    {
                        entityDeclarationNode = entityDeclarationNode.Parent;
                    }
                    var entity = (EntityDeclaration)entityDeclarationNode;
                    bool isStatic = entity.HasModifier(Modifiers.Static);

                    FieldDeclaration field = new FieldDeclaration()
                    {
                        Modifiers = isStatic ? Modifiers.Static : Modifiers.None,
                        ReturnType = extractedType,
                        Variables = { new VariableInitializer(name) }
                    };
                    AstNode nodeToRemove = RemoveDeclaration(varInit) ? varInit.Parent : type;
                    s.Remove(nodeToRemove, true);
                    s.InsertWithCursor(context.TranslateString("Insert new field"), Script.InsertPosition.Before, field);
                    s.FormatText(varInit.Parent);
                }, varInit));
            }

            var idntf = context.GetNode <Identifier>();

            if (idntf == null)
            {
                yield break;
            }
            var paramDec = idntf.Parent as ParameterDeclaration;

            if (paramDec != null)
            {
                var ctor = paramDec.Parent as ConstructorDeclaration;
                if (ctor == null)
                {
                    yield break;
                }
                MemberReferenceExpression thisField = new MemberReferenceExpression(new ThisReferenceExpression(), idntf.Name, new AstType[] {});
                var assign             = new AssignmentExpression(thisField, AssignmentOperatorType.Assign, new IdentifierExpression(idntf.Name));
                var statement          = new ExpressionStatement(assign);
                var type               = (idntf.GetPrevNode() as AstType).Clone();
                FieldDeclaration field = new FieldDeclaration()
                {
                    ReturnType = type.Clone(),
                    Variables  = { new VariableInitializer(idntf.Name) }
                };
                yield return(new CodeAction(context.TranslateString("Assign to new field"), s => {
                    s.InsertWithCursor(context.TranslateString("Insert new field"), Script.InsertPosition.Before, field);
                    s.AddTo(ctor.Body, statement);
                }, paramDec));
            }
        }