Ejemplo n.º 1
0
            public override void VisitTypeDeclaration(TypeDeclaration typeDeclaration)
            {
                if (typeDeclaration.ClassType == ClassType.Interface || typeDeclaration.ClassType == ClassType.Enum)
                {
                    return;
                }
                base.VisitTypeDeclaration(typeDeclaration);
                var rr = ctx.Resolve(typeDeclaration);

                if (rr.IsError)
                {
                    return;
                }
                foreach (var baseType in typeDeclaration.BaseTypes)
                {
                    var bt = ctx.Resolve(baseType);
                    if (bt.IsError || bt.Type.Kind != TypeKind.Interface)
                    {
                        continue;
                    }
                    bool interfaceMissing;
                    var  toImplement = ImplementInterfaceAction.CollectMembersToImplement(rr.Type.GetDefinition(), bt.Type, false, out interfaceMissing);
                    if (toImplement.Count == 0)
                    {
                        continue;
                    }

                    AddIssue(new CodeIssue(baseType, ctx.TranslateString("Missing interface member implementations"))
                    {
                        ActionProvider = { typeof(ImplementInterfaceAction), typeof(ImplementInterfaceExplicitAction) }
                    });
                }
            }
        public override IEnumerable <CodeAction> GetActions(RefactoringContext context)
        {
            var service = (CodeGenerationService)context.GetService(typeof(CodeGenerationService));

            if (service == null)
            {
                yield break;
            }

            var type = context.GetNode <AstType>();

            if (type == null || type.Role != Roles.BaseType)
            {
                yield break;
            }
            var state = context.GetResolverStateBefore(type);

            if (state.CurrentTypeDefinition == null)
            {
                yield break;
            }

            var resolveResult = context.Resolve(type);

            if (resolveResult.Type.Kind != TypeKind.Interface)
            {
                yield break;
            }

            bool interfaceMissing;
            var  toImplement = ImplementInterfaceAction.CollectMembersToImplement(
                state.CurrentTypeDefinition,
                resolveResult.Type,
                false,
                out interfaceMissing
                );

            if (toImplement.Count == 0)
            {
                yield break;
            }

            yield return(new CodeAction(context.TranslateString("Implement interface explicit"), script =>
                                        script.InsertWithCursor(
                                            context.TranslateString("Implement Interface"),
                                            state.CurrentTypeDefinition,
                                            (s, c) => ImplementInterfaceAction.GenerateImplementation(c, toImplement.Select(t => Tuple.Create(t.Item1, true)), interfaceMissing).ToList()
                                            )
                                        , type));
        }