コード例 #1
0
ファイル: Trimmer.cs プロジェクト: mlacouture/buildtools
        public override List <IPropertyDefinition> Rewrite(List <IPropertyDefinition> propertyDefinitions)
        {
            TrimType currentType = CurrentTrimElement as TrimType;

            List <IPropertyDefinition> newList = new List <IPropertyDefinition>();

            if (propertyDefinitions == null)
            {
                return(newList);
            }
            foreach (IPropertyDefinition property in propertyDefinitions)
            {
                MemberElement currentElement = currentType.GetMemberElementFromMember(property);

                if (currentElement != null)
                {
                    _trimElements.Push(currentElement);

                    IPropertyDefinition newProperty = Rewrite(property);
                    newList.Add(newProperty);

                    _trimElements.Pop();
                }
            }

            return(newList);
        }
コード例 #2
0
        /// <summary>
        /// Find the best match from a set of overloaded methods
        /// </summary>
        /// <param name="customInfoArray"></param>
        /// <param name="previous"></param>
        /// <param name="argTypes"></param>
        private void ResolveOverloads(CustomMethodInfo[] customInfoArray, MemberElement previous, Type[] argTypes)
        {
            // Compute a score for each candidate
            foreach (var customMethodInfo in customInfoArray)
            {
                customMethodInfo.ComputeScore(argTypes);
            }

            // Sort array from best to worst matches
            Array.Sort(customInfoArray);

            // Discard any matches that aren't accessible
            customInfoArray = GetAccessibleInfos(customInfoArray);

            // No accessible methods left
            if (customInfoArray.Length == 0)
            {
                ThrowNoAccessibleMethodsException(previous);
            }

            // Handle case where we have more than one match with the same score
            DetectAmbiguousMatches(customInfoArray);

            // If we get here, then there is only one best match
            targetMethodInfo = customInfoArray[0];
        }
コード例 #3
0
 public InvocationListElement(IList elements, IServiceProvider services)
 {
     this.HandleFirstElement(elements, services);
     LinkElements(elements);
     Resolve(elements, services);
     _myTail = (MemberElement)elements[elements.Count - 1];
 }
コード例 #4
0
ファイル: FunctionCall.cs プロジェクト: xiaoxiongnpu/Flee
        /// <summary>
        /// Try to find a match from a set of methods
        /// </summary>
        /// <param name="methods"></param>
        /// <param name="previous"></param>
        /// <param name="argTypes"></param>
        private void BindToMethod(ICollection <MethodInfo> methods, MemberElement previous, Type[] argTypes)
        {
            List <CustomMethodInfo> customInfos = new List <CustomMethodInfo>();

            // Wrap the MethodInfos in our custom class
            foreach (MethodInfo mi in methods)
            {
                CustomMethodInfo cmi = new CustomMethodInfo(mi);
                customInfos.Add(cmi);
            }

            // Discard any methods that cannot qualify as overloads
            CustomMethodInfo[] arr = customInfos.ToArray();
            customInfos.Clear();

            foreach (CustomMethodInfo cmi in arr)
            {
                if (cmi.IsMatch(argTypes, MyPrevious, MyContext) == true)
                {
                    customInfos.Add(cmi);
                }
            }

            if (customInfos.Count == 0)
            {
                // We have no methods that can qualify as overloads; throw exception
                this.ThrowFunctionNotFoundException(previous);
            }
            else
            {
                // At least one method matches our criteria; do our custom overload resolution
                this.ResolveOverloads(customInfos.ToArray(), previous, argTypes);
            }
        }
コード例 #5
0
ファイル: Trimmer.cs プロジェクト: mlacouture/buildtools
        public override List <IEventDefinition> Rewrite(List <IEventDefinition> eventDefinitions)
        {
            TrimType currentType = CurrentTrimElement as TrimType;

            List <IEventDefinition> newList = new List <IEventDefinition>();

            if (eventDefinitions == null)
            {
                return(newList);
            }
            foreach (IEventDefinition evnt in eventDefinitions)
            {
                MemberElement currentElement = currentType.GetMemberElementFromMember(evnt);

                if (currentElement != null)
                {
                    _trimElements.Push(currentElement);

                    IEventDefinition newEvnt = Rewrite(evnt);
                    newList.Add(newEvnt);

                    _trimElements.Pop();
                }
            }

            return(newList);
        }
コード例 #6
0
        /// <summary>
        /// Try to find a match from a set of methods
        /// </summary>
        /// <param name="methods"></param>
        /// <param name="previous"></param>
        /// <param name="argTypes"></param>
        private void BindToMethod(ICollection <MethodInfo> methods, MemberElement previous, Type[] argTypes)
        {
            var customInfoList = new List <CustomMethodInfo>();

            // Wrap the MethodInfo in our custom class
            foreach (var methodInfo in methods)
            {
                var customMethodInfo = new CustomMethodInfo(methodInfo);
                customInfoList.Add(customMethodInfo);
            }

            // Discard any methods that cannot qualify as overloads
            var infoArray = customInfoList.ToArray();

            customInfoList.Clear();

            foreach (var methodInfo in infoArray)
            {
                if (methodInfo.IsMatch(argTypes))
                {
                    customInfoList.Add(methodInfo);
                }
            }

            if (customInfoList.Count == 0)
            {
                // We have no methods that can qualify as overloads; throw exception
                ThrowFunctionNotFoundException(previous);
            }
            else
            {
                // At least one method matches our criteria; do our custom overload resolution
                ResolveOverloads(customInfoList.ToArray(), previous, argTypes);
            }
        }
コード例 #7
0
ファイル: Trimmer.cs プロジェクト: mlacouture/buildtools
        public override List <IMethodDefinition> Rewrite(List <IMethodDefinition> methodDefinitions)
        {
            TrimType currentType = CurrentTrimElement as TrimType;

            List <IMethodDefinition> newList = new List <IMethodDefinition>();

            if (methodDefinitions == null)
            {
                return(newList);
            }
            foreach (IMethodDefinition method in methodDefinitions)
            {
                MemberElement currentElement = currentType.GetMemberElementFromMember(method);

                if (currentElement != null)
                {
                    _trimElements.Push(currentElement);

                    IMethodDefinition newMethod = Rewrite(method);
                    newList.Add(newMethod);

                    _trimElements.Pop();
                }
            }

            return(newList);
        }
コード例 #8
0
ファイル: FunctionCall.cs プロジェクト: xiaoxiongnpu/Flee
        /// <summary>
        /// Find the best match from a set of overloaded methods
        /// </summary>
        /// <param name="infos"></param>
        /// <param name="previous"></param>
        /// <param name="argTypes"></param>
        private void ResolveOverloads(CustomMethodInfo[] infos, MemberElement previous, Type[] argTypes)
        {
            // Compute a score for each candidate
            foreach (CustomMethodInfo cmi in infos)
            {
                cmi.ComputeScore(argTypes);
            }

            // Sort array from best to worst matches
            Array.Sort <CustomMethodInfo>(infos);

            // Discard any matches that aren't accessible
            infos = this.GetAccessibleInfos(infos);

            // No accessible methods left
            if (infos.Length == 0)
            {
                this.ThrowNoAccessibleMethodsException(previous);
            }

            // Handle case where we have more than one match with the same score
            this.DetectAmbiguousMatches(infos);

            // If we get here, then there is only one best match
            _myTargetMethodInfo = infos[0];
        }
コード例 #9
0
        public void TestMarkdownOutput()
        {
            reader.MoveToContent();
            IElement element = new MemberElement(reader).Create("member");

            Assert.AreEqual($@"#### T:TestDoc.TestClass \n\n", element.ToMarkdown());
        }
コード例 #10
0
        private static bool AreValidExtensionMethodArgumentsForParameters(Type[] argTypes, ParameterInfo[] parameters,
                                                                          MemberElement previous, ExpressionContext context)
        {
            Debug.Assert(argTypes.Length + 1 == parameters.Length);

            if (previous != null)
            {
                if (ImplicitConverter.EmitImplicitConvert(previous.ResultType, parameters[0].ParameterType, null) == false)
                {
                    return(false);
                }
            }
            else if (context.ExpressionOwner != null)
            {
                if (ImplicitConverter.EmitImplicitConvert(context.ExpressionOwner.GetType(), parameters[0].ParameterType, null) == false)
                {
                    return(false);
                }
            }
            else
            {
                return(false);
            }

            // Match if every given argument is implicitly convertible to the method's corresponding parameter
            for (int i = 0; i < argTypes.Length; i++)
            {
                if (ImplicitConverter.EmitImplicitConvert(argTypes[i], parameters[i + 1].ParameterType, null) == false)
                {
                    return(false);
                }
            }

            return(true);
        }
コード例 #11
0
        /// <summary>
        /// Writes the code element body text.
        /// </summary>
        /// <param name="element">The element.</param>
        private void WriteBody(TextCodeElement element)
        {
            MemberElement memberElement     = element as MemberElement;
            TypeElement   parentTypeElement = GetTypeParent(element);

            bool isAbstract = memberElement != null &&
                              (memberElement.MemberModifiers & MemberModifiers.Abstract) == MemberModifiers.Abstract;
            bool inInterface = memberElement != null &&
                               parentTypeElement != null && parentTypeElement.Type == TypeElementType.Interface;

            if (!(isAbstract || inInterface))
            {
                WriteBeginBlock();

                Writer.WriteLine();
                if (element.BodyText != null && element.BodyText.Trim().Length > 0)
                {
                    WriteTextBlock(element.BodyText);
                    Writer.WriteLine();
                    WriteEndBlock(element);
                    WriteClosingComment(element, VBSymbol.BeginComment.ToString());
                }
                else
                {
                    WriteEndBlock(element);
                }
            }
        }
コード例 #12
0
ファイル: InvocationListElement.cs プロジェクト: Verent/Yale
        public InvocationListElement(IList elements, ExpressionContext context)
        {
            HandleFirstElement(elements, context);
            LinkElements(elements);
            Resolve(elements, context);

            //Todo: What is the _tail reference?
            _tail = (MemberElement)elements[elements.Count - 1];
        }
コード例 #13
0
ファイル: Miscellaneous.cs プロジェクト: khodaie/Flee
        /// <summary>
        /// Is the given MethodInfo usable as an overload?
        /// </summary>
        /// <param name="argTypes"></param>
        /// <returns></returns>
        public bool IsMatch(Type[] argTypes, MemberElement previous, ExpressionContext context)
        {
            ParameterInfo[] parameters = _myTarget.GetParameters();

            // If there are no parameters and no arguments were passed, then we are a match.
            if (parameters.Length == 0 & argTypes.Length == 0)
            {
                return(true);
            }

            // If there are no parameters but there are arguments, we cannot be a match
            if (parameters.Length == 0 & argTypes.Length > 0)
            {
                return(false);
            }

            // Is the last parameter a paramArray?
            ParameterInfo lastParam = parameters[parameters.Length - 1];

            if (lastParam.IsDefined(typeof(ParamArrayAttribute), false) == false)
            {
                //Extension method support
                if (parameters.Length == argTypes.Length + 1)
                {
                    IsExtensionMethod = true;
                    return(AreValidExtensionMethodArgumentsForParameters(argTypes, parameters, previous, context));
                }
                if ((parameters.Length != argTypes.Length))
                {
                    // Not a paramArray and parameter and argument counts don't match
                    return(false);
                }
                else
                {
                    // Regular method call, do the test
                    return(AreValidArgumentsForParameters(argTypes, parameters));
                }
            }

            // At this point, we are dealing with a paramArray call

            // If the parameter and argument counts are equal and there is an implicit conversion from one to the other, we are a match.
            if (parameters.Length == argTypes.Length && AreValidArgumentsForParameters(argTypes, parameters) == true)
            {
                return(true);
            }
            else if (this.IsParamArrayMatch(argTypes, parameters, lastParam) == true)
            {
                IsParamArray = true;
                return(true);
            }
            else
            {
                return(false);
            }
        }
コード例 #14
0
ファイル: FunctionCall.cs プロジェクト: xiaoxiongnpu/Flee
 private void ThrowNoAccessibleMethodsException(MemberElement previous)
 {
     if (previous == null)
     {
         base.ThrowCompileException(CompileErrorResourceKeys.NoAccessibleMatches, CompileExceptionReason.AccessDenied, MyName, _myArguments);
     }
     else
     {
         base.ThrowCompileException(CompileErrorResourceKeys.NoAccessibleMatchesOnType, CompileExceptionReason.AccessDenied, MyName, _myArguments, previous.TargetType.Name);
     }
 }
コード例 #15
0
 private void ThrowFunctionNotFoundException(MemberElement previous)
 {
     if (previous == null)
     {
         throw CreateCompileException(CompileErrors.UndefinedFunction, CompileExceptionReason.UndefinedName, MemberName, arguments);
     }
     else
     {
         throw CreateCompileException(CompileErrors.UndefinedFunctionOnType, CompileExceptionReason.UndefinedName, MemberName, arguments, previous.TargetType.Name);
     }
 }
コード例 #16
0
ファイル: FunctionCall.cs プロジェクト: xiaoxiongnpu/Flee
 private void ThrowFunctionNotFoundException(MemberElement previous)
 {
     if (previous == null)
     {
         base.ThrowCompileException(CompileErrorResourceKeys.UndefinedFunction, CompileExceptionReason.UndefinedName, MyName, _myArguments);
     }
     else
     {
         base.ThrowCompileException(CompileErrorResourceKeys.UndefinedFunctionOnType, CompileExceptionReason.UndefinedName, MyName, _myArguments, previous.TargetType.Name);
     }
 }
コード例 #17
0
 private void ThrowNoAccessibleMethodsException(MemberElement previous)
 {
     if (previous == null)
     {
         throw CreateCompileException(CompileErrors.NoAccessibleMatches, CompileExceptionReason.AccessDenied, MemberName, arguments);
     }
     else
     {
         throw CreateCompileException(CompileErrors.NoAccessibleMatchesOnType, CompileExceptionReason.AccessDenied, MemberName, arguments, previous.TargetType.Name);
     }
 }
コード例 #18
0
        public virtual TrimMember GetMemberElementFromMember(ITypeMemberReference member)
        {
            if (member == null || member.GetType().ToString().Contains("Dummy"))
            {
                throw new ArgumentNullException("member");
            }
            MemberElement memberElement = null;

            _typeMembers.TryGetValue(Util.MemberKeyFromMember(member), out memberElement);

            return(memberElement as TrimMember);
        }
コード例 #19
0
        public static RootElement New(string mapName)
        {
            var obj = new RootElement(mapName);

            var controller = new MemberElement("controller");

            controller.Int.Add(new IntElement("ownership", 1));

            obj.Member.Add(controller);

            return(obj);
        }
コード例 #20
0
        /// <summary>
        /// Creates a clone of this instance.
        /// </summary>
        /// <returns>Cloned attribute element state.</returns>
        protected override sealed AttributedElement DoAttributedClone()
        {
            MemberElement clone = DoMemberClone();

            //
            // Copy state
            //
            clone._memberModifiers = _memberModifiers;
            clone._type            = _type;

            return(clone);
        }
コード例 #21
0
        public void MemberElementTests()
        {
            // Type Element : Class
            MemberElement typeElement = new MemberElement(XMLClassElement);

            Assert.AreEqual($"## Class {XMLClassElement.Attribute("name").Value.Split('.').Last()}", typeElement.MarkdownValue);

            // Property Element : Property
            MemberElement propElement = new MemberElement(XMLPropertyElement);

            Assert.AreEqual($"#### Property {XMLPropertyElement.Attribute("name").Value.Split('.').Last()}", propElement.MarkdownValue);
        }
コード例 #22
0
 private ParamDeclaration DeclareParam(MemberElement param)
 {
     return(new ParamDeclaration
     {
         VkName = param.VkName,
         Type = new TypeReference
         {
             VkName = param.Type,
             PointerType = param.PointerType
         },
         Name = this.nameFormatter.FormatName(param, true)
     });
 }
コード例 #23
0
 /// <summary>
 /// Arrange elements as a linked list
 /// </summary>
 /// <param name="elements"></param>
 private static void LinkElements(IList elements)
 {
     for (int i = 0; i <= elements.Count - 1; i++)
     {
         MemberElement current     = (MemberElement)elements[i];
         MemberElement nextElement = null;
         if (i + 1 < elements.Count)
         {
             nextElement = (MemberElement)elements[i + 1];
         }
         current.Link(nextElement);
     }
 }
コード例 #24
0
        private void AddReferencedVariable(MemberElement previous)
        {
            if ((previous != null))
            {
                return;
            }

            if ((_myVariableType != null) || MyOptions.IsOwnerType(this.MemberOwnerType) == true)
            {
                ExpressionInfo info = (ExpressionInfo)MyServices.GetService(typeof(ExpressionInfo));
                info.AddReferencedVariable(MyName);
            }
        }
コード例 #25
0
        private bool ResolveVirtualProperty(MemberElement previous)
        {
            if (previous == null)
            {
                // We can't use virtual properties if we are the first element
                return(false);
            }

            PropertyDescriptorCollection coll = TypeDescriptor.GetProperties(previous.ResultType);

            _myPropertyDescriptor = coll.Find(MyName, true);
            return(_myPropertyDescriptor != null);
        }
コード例 #26
0
        private bool ResolveVirtualProperty(MemberElement previous)
        {
            if (previous == null)
            {
                // We can't use virtual properties if we are the first element
                return(false);
            }

            var properties = TypeDescriptor.GetProperties(previous.ResultType);

            propertyDescriptor = properties.Find(MemberName, true);
            return(propertyDescriptor != null);
        }
コード例 #27
0
        private void ReadMemberContent_correctly_parses_seealso_elements(string xml, SeeAlsoElement expected)
        {
            // ARRANGE
            xml = $@"<container>{xml}</container>";

            var sut           = new XmlDocsReader(NullLogger.Instance, new XDocument(), Array.Empty <TypeId>());
            var memberElement = new MemberElement(MemberId.Parse("T:DemoProject.DemoClass", Array.Empty <TypeId>()));

            // ACT
            sut.ReadMemberContent(XElement.Parse(xml), memberElement);

            // ASSERT
            var actual = Assert.Single(memberElement.SeeAlso);

            Assert.Equal(expected, actual);
        }
コード例 #28
0
ファイル: FunctionCall.cs プロジェクト: PorucikPihrt/Flee
        public void EmitFunctionCall(bool nextRequiresAddress, FleeILGenerator ilg, IServiceProvider services)
        {
            ParameterInfo[]     parameters = this.Method.GetParameters();
            ExpressionElement[] elements   = _myArguments.ToArray();

            // Emit either a regular or paramArray call
            if (_myTargetMethodInfo.IsParamArray == false)
            {
                this.EmitRegularFunctionInternal(parameters, elements, ilg, services);
            }
            else
            {
                this.EmitParamArrayArguments(parameters, elements, ilg, services);
            }

            MemberElement.EmitMethodCall(this.ResultType, nextRequiresAddress, this.Method, ilg);
        }
コード例 #29
0
        /// <summary>
        /// Writes the end block for an element.
        /// </summary>
        /// <param name="codeElement">The code element.</param>
        private void WriteEndBlock(CodeElement codeElement)
        {
            TabCount--;

            MemberElement memberElement = codeElement as MemberElement;
            string        blockName     = string.Empty;

            if (memberElement != null)
            {
                if (memberElement.ElementType == ElementType.Method ||
                    memberElement.ElementType == ElementType.Constructor)
                {
                    MethodElement methodElement = memberElement as MethodElement;
                    if (methodElement != null && methodElement.IsOperator)
                    {
                        blockName = VBKeyword.Operator;
                    }
                    else if (memberElement.Type != null)
                    {
                        blockName = VBKeyword.Function;
                    }
                    else
                    {
                        blockName = VBKeyword.Sub;
                    }
                }
            }

            if (string.IsNullOrEmpty(blockName))
            {
                TypeElement typeElement = codeElement as TypeElement;
                if (typeElement != null)
                {
                    blockName = EnumUtilities.ToString(typeElement.Type);
                }

                if (string.IsNullOrEmpty(blockName))
                {
                    blockName = EnumUtilities.ToString(codeElement.ElementType);
                }
            }

            WriteIndented(VBKeyword.End + ' ' + blockName);
        }
コード例 #30
0
        private bool ResolveFieldProperty(MemberElement previous)
        {
            MemberInfo[] members = this.GetMembers(MemberTypes.Field | MemberTypes.Property);

            // Keep only the ones which are accessible
            members = this.GetAccessibleMembers(members);

            if (members.Length == 0)
            {
                // No accessible members; try to resolve a virtual property
                return(this.ResolveVirtualProperty(previous));
            }
            else if (members.Length > 1)
            {
                // More than one accessible member
                if (previous == null)
                {
                    base.ThrowCompileException(CompileErrorResourceKeys.IdentifierIsAmbiguous, CompileExceptionReason.AmbiguousMatch, MyName);
                }
                else
                {
                    base.ThrowCompileException(CompileErrorResourceKeys.IdentifierIsAmbiguousOnType, CompileExceptionReason.AmbiguousMatch, MyName, previous.TargetType.Name);
                }
            }
            else
            {
                // Only one member; bind to it
                _myField = members[0] as FieldInfo;
                if ((_myField != null))
                {
                    return(true);
                }

                // Assume it must be a property
                _myProperty = (PropertyInfo)members[0];
                return(true);
            }

            return(false);
        }