コード例 #1
0
        private IMethodElement FindExtensionMethodInClass(IClassElement classElement, string methodName, ITypeElement callerType, Expression qualifier)
        {
            if (classElement == null || callerType == null)
            {
                return(null);
            }

            bool isCaseSensitiveLanguage = CodeRush.Language.IsCaseSensitive;

            IMemberElementCollection classElementMembers = classElement.Members;

            foreach (IElement member in classElementMembers)
            {
                IMethodElement method = member as IMethodElement;
                if (method == null)
                {
                    continue;
                }

                if (String.Compare(method.Name, methodName, !isCaseSensitiveLanguage) == 0)
                {
                    if (method.IsExtensionMethod())
                    {
                        if (ExtendsTheCallerType(method, callerType, qualifier))
                        {
                            return(method);
                        }
                    }
                }
            }
            return(null);
        }
コード例 #2
0
        private bool ExtendsTheCallerType(IMethodElement method, ITypeElement callerType, Expression qualifier)
        {
            if (method == null || callerType == null)
                return false;

            if (method.Parameters.Count == 0)
                return false;
            ISourceTreeResolver resolver = ParserServices.SourceTreeResolver;
            ExpressionCollection arguments = new ExpressionCollection();
            arguments.Add(qualifier);
            method = GenericElementActivator.ActivateMemberIfNeeded(resolver, method, arguments, null, ArgumentsHelper.ResolveArgumentTypes(resolver, arguments)) as IMethodElement;

            if (method == null)
                return false;

            IParameterElement extensionParam = method.Parameters[0] as IParameterElement;
            if (extensionParam == null)
                return false;

            ITypeReferenceExpression typeRef = extensionParam.Type;
            if (typeRef == null)
                return false;
            ITypeElement type = typeRef.GetDeclaration() as ITypeElement;
            if (type == null)
                return false;
            IArrayTypeElement arrayType = callerType as IArrayTypeElement;
            //if (arrayType != null)
            //{
            //  return true;
            //}
            //else
            return ArgumentsHelper.HasParamConversion(resolver, extensionParam, callerType, qualifier, TypeConversionMode.ImplicitConversion);
        }
コード例 #3
0
        private static IMemberElement getObjectCreationExpression_MemberElement(IObjectCreationExpression creationExp)
        {
            foreach (var child in creationExp.ObjectType.GetDeclaration().AllChildren)
            {
                IMethodElement childMethod = (child as IMethodElement);
                if ((childMethod != null) && (childMethod.IsConstructor))
                {
                    if (creationExp.Arguments.Count == childMethod.Parameters.Count)
                    {
                        if (creationExp.Arguments.Count == 0)
                        {
                            return(childMethod);
                        }

                        for (int i = 0; i < childMethod.Parameters.Count; i++)
                        {
                            if (creationExp.Arguments[i].Is(childMethod.Parameters[i].Type.GetDeclaration() as ITypeElement))
                            {
                                return(childMethod);
                            }
                        }
                    }
                }
            }

            return(null);
        }
コード例 #4
0
ファイル: DynaType.cs プロジェクト: jasonholloway/FakeOrleans
        public static void Emit(this ILGenerator il, OpCode opcode, IMethodElement el)
        {
            var m          = el as IMemberInfoSource;
            var methodInfo = m.MemberInfo as MethodInfo;

            il.Emit(opcode, methodInfo);
        }
コード例 #5
0
        private bool MethodHasIssue(IMethodElement method)
        {
            if (!method.IsTestMethod())
                return false;

            var assert = GetAssert(method);
            var exceptionAttribute = GetExpectedExceptionAttribute(method);
            return assert == null && exceptionAttribute == null;
        }
コード例 #6
0
        private bool ExtendsTheCallerType(IMethodElement method, ITypeElement callerType, Expression qualifier)
        {
            if (method == null || callerType == null)
            {
                return(false);
            }


            if (method.Parameters.Count == 0)
            {
                return(false);
            }
            ISourceTreeResolver  resolver  = ParserServices.SourceTreeResolver;
            ExpressionCollection arguments = new ExpressionCollection();

            arguments.Add(qualifier);
            method = GenericElementActivator.ActivateMemberIfNeeded(resolver, method, arguments, null, ArgumentsHelper.ResolveArgumentTypes(resolver, arguments)) as IMethodElement;

            if (method == null)
            {
                return(false);
            }

            IParameterElement extensionParam = method.Parameters[0] as IParameterElement;

            if (extensionParam == null)
            {
                return(false);
            }


            ITypeReferenceExpression typeRef = extensionParam.Type;

            if (typeRef == null)
            {
                return(false);
            }
            ITypeElement type = typeRef.GetDeclaration() as ITypeElement;

            if (type == null)
            {
                return(false);
            }
            IArrayTypeElement arrayType = callerType as IArrayTypeElement;

            //if (arrayType != null)
            //{
            //  return true;
            //}
            //else
            return(ArgumentsHelper.HasParamConversion(resolver, extensionParam, callerType, qualifier, TypeConversionMode.ImplicitConversion));
        }
コード例 #7
0
        private static bool IsExtensionMethod(IWithParameters declaration)
        {
            if (declaration == null || declaration.Parameters == null || declaration.Parameters.Count == 0)
            {
                return(false);
            }

            IMethodElement methodElement = declaration as IMethodElement;

            if (methodElement == null)
            {
                return(false);
            }


            return(methodElement.IsExtensionMethod());
        }
コード例 #8
0
        private static bool checkIfParametersAreTheSame(IMethodElement methodElement, IMethodElement currMethodElement)
        {
            if ((methodElement.Parameters.Count == 0) && (currMethodElement.Parameters.Count == 0))
            return true;

              bool found = false;

              if (methodElement.Parameters.Count == currMethodElement.Parameters.Count)
              {
            for (int i = 0; i < methodElement.Parameters.Count && !found; i++)
            {
              if (methodElement.Parameters[i].Type.IsIdenticalTo(currMethodElement.Parameters[i].Type))
              {
            found = true;
              }
            }
              }

              return found;
        }
コード例 #9
0
        private static bool checkIfParametersAreTheSame(IMethodElement methodElement, IMethodElement currMethodElement)
        {
            if ((methodElement.Parameters.Count == 0) && (currMethodElement.Parameters.Count == 0))
            {
                return(true);
            }

            bool found = false;

            if (methodElement.Parameters.Count == currMethodElement.Parameters.Count)
            {
                for (int i = 0; i < methodElement.Parameters.Count && !found; i++)
                {
                    if (methodElement.Parameters[i].Type.IsIdenticalTo(currMethodElement.Parameters[i].Type))
                    {
                        found = true;
                    }
                }
            }

            return(found);
        }
コード例 #10
0
        // event handlers...
        private void cpAddReference_CheckAvailability(object sender, CheckContentAvailabilityEventArgs ea)
        {
            LanguageElement activeMethodRerence = GetActiveMethodReference(ea.Element);

            if (activeMethodRerence == null)
            {
                return;
            }

            ITypeElement callerType;
            Expression   qualifier;

            if (!IsValidReferenceAndQualifier(activeMethodRerence, out callerType, out qualifier))
            {
                return;
            }

            IEnumerable projectSymbols = GetProjectSymbols();

            if (projectSymbols == null)
            {
                return;
            }

            string         methodNameToFind = activeMethodRerence.Name;
            IMethodElement extensionMethod  = FindExtensionMethod(projectSymbols, methodNameToFind, callerType, qualifier);

            if (extensionMethod == null || extensionMethod.ParentNamespace == null)
            {
                return;
            }

            _NamespaceOfExtensionMethod = extensionMethod.ParentNamespace.FullName;

            ea.Available = true;
        }
コード例 #11
0
 public static bool IsTestMethod(this IMethodElement currentMethod)
 {
     return currentMethod.Attributes.Cast<IAttributeElement>().Count(a => _testMethodAttributes.Contains(a.Name)) > 0;
 }
コード例 #12
0
 private IAttributeElement GetExpectedExceptionAttribute(IMethodElement method)
 {
     return method.Attributes.OfType<IAttributeElement>().FirstOrDefault(attr => _expectedExceptionAttributes.Contains(attr.Name)); 
 }
コード例 #13
0
 private static IElementReferenceExpression GetAssert(IMethodElement method)
 {
     return method.FindChildByName("Assert") as IElementReferenceExpression;
 }