예제 #1
0
        public static List <IMember> CollectMembersToImplement(ITypeDefinition implementingType, IType abstractType)
        {
            var  toImplement = new List <IMember>();
            bool alreadyImplemented;

            foreach (var member in abstractType.GetMembers(d => !d.IsSynthetic && d.IsAbstract))
            {
                alreadyImplemented = false;
                var allBaseTypes = member.DeclaringType.GetAllBaseTypes().ToList();
                foreach (var cmet in implementingType.GetMembers(d => d.SymbolKind == member.SymbolKind && d.Name == member.Name))
                {
                    if (allBaseTypes.Contains(cmet.DeclaringType))
                    {
                        continue;
                    }
                    if (ImplementInterfaceAction.CompareMembers(member, cmet))
                    {
                        alreadyImplemented = true;
                        break;
                    }
                }
                if (!alreadyImplemented)
                {
                    toImplement.Add(member);
                }
            }
            return(toImplement);
        }
예제 #2
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 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);
		}
		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;

				var allBaseTypes = method.DeclaringType.GetAllBaseTypes().ToList ();
				foreach (var cmet in implementingType.GetMethods (d => !d.IsAbstract && d.Name == method.Name)) {
					if (allBaseTypes.Contains(cmet.DeclaringType))
						continue;
					if (ImplementInterfaceAction.CompareMethods(method, cmet)) {
						alreadyImplemented = true;
						break;
					}
				}
				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;
		}
        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));
        }
예제 #6
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)))
                    );
            }));
        }