Example #1
0
        public IEnumerable <CodeAction> GetActions(RefactoringContext context)
        {
            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.Class || resolveResult.Type.GetDefinition() == null || !resolveResult.Type.GetDefinition().IsAbstract)
            {
                yield break;
            }

            var toImplement = CollectMembersToImplement(state.CurrentTypeDefinition, resolveResult.Type);

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

            yield return(new CodeAction(context.TranslateString("Implement abstract members"), script => {
                script.InsertWithCursor(
                    context.TranslateString("Implement abstract members"),
                    state.CurrentTypeDefinition,
                    ImplementInterfaceAction.GenerateImplementation(context, toImplement.Select(m => Tuple.Create(m, false))).Select(entity => {
                    var decl = entity as EntityDeclaration;
                    if (decl != null)
                    {
                        decl.Modifiers |= Modifiers.Override;
                    }
                    return entity;
                })
                    );
            }, type));
        }
Example #2
0
        public IEnumerable <CodeAction> GetActions(RefactoringContext context)
        {
            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;
            }

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

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

            yield return(new CodeAction(context.TranslateString("Implement interface explicit"), script => {
                script.InsertWithCursor(
                    context.TranslateString("Implement Interface"),
                    state.CurrentTypeDefinition,
                    ImplementInterfaceAction.GenerateImplementation(context, toImplement.Select(t => Tuple.Create(t.Item1, true)))
                    );
            }));
        }
Example #3
0
        public static List <IMember> CollectMembersToImplement(ITypeDefinition implementingType, IType abstractType)
        {
//			var def = abstractType.GetDefinition();
            var  toImplement = new List <IMember>();
            bool alreadyImplemented;

            // Stub out non-implemented events defined by @iface
            foreach (var ev in abstractType.GetEvents(e => !e.IsSynthetic && e.IsAbstract))
            {
                alreadyImplemented = implementingType.GetAllBaseTypeDefinitions().Any(
                    x => x.Kind != TypeKind.Interface && x.Events.Any(y => y.Name == ev.Name)
                    );

                if (!alreadyImplemented)
                {
                    toImplement.Add(ev);
                }
            }

            // Stub out non-implemented methods defined by @iface
            foreach (var method in abstractType.GetMethods(d => !d.IsSynthetic && d.IsAbstract))
            {
                alreadyImplemented = false;

                foreach (var cmet in implementingType.GetMethods())
                {
                    if (!cmet.IsAbstract && ImplementInterfaceAction.CompareMethods(method, cmet))
                    {
                        alreadyImplemented = true;
                    }
                }
                if (!alreadyImplemented)
                {
                    toImplement.Add(method);
                }
            }

            // Stub out non-implemented properties defined by @iface
            foreach (var prop in abstractType.GetProperties(p => !p.IsSynthetic && p.IsAbstract))
            {
                alreadyImplemented = false;
                foreach (var t in implementingType.GetAllBaseTypeDefinitions())
                {
                    if (t.Kind == TypeKind.Interface)
                    {
                        continue;
                    }
                    foreach (IProperty cprop in t.Properties)
                    {
                        if (!cprop.IsAbstract && cprop.Name == prop.Name)
                        {
                            alreadyImplemented = true;
                        }
                    }
                }
                if (!alreadyImplemented)
                {
                    toImplement.Add(prop);
                }
            }
            return(toImplement);
        }