Exemplo n.º 1
0
        public static void AddContentsFromCalling(ArrayList result, IClass callingClass, IMember callingMember)
        {
            IMethodOrProperty methodOrProperty = callingMember as IMethodOrProperty;

            if (methodOrProperty != null)
            {
                foreach (IParameter p in methodOrProperty.Parameters)
                {
                    result.Add(new DefaultField.ParameterField(p.ReturnType, p.Name, methodOrProperty.Region, callingClass));
                }
                if (callingMember is IMethod)
                {
                    AddTypeParametersForCtrlSpace(result, ((IMethod)callingMember).TypeParameters);
                }
            }

            bool inStatic = false;

            if (callingMember != null)
            {
                inStatic = callingMember.IsStatic;
            }

            if (callingClass != null)
            {
                AddTypeParametersForCtrlSpace(result, callingClass.TypeParameters);

                ArrayList   members = new ArrayList();
                IReturnType t       = callingClass.DefaultReturnType;
                members.AddRange(t.GetMethods());
                members.AddRange(t.GetFields());
                members.AddRange(t.GetEvents());
                members.AddRange(t.GetProperties());
                foreach (IMember m in members)
                {
                    if ((!inStatic || m.IsStatic) && m.IsAccessible(callingClass, true))
                    {
                        result.Add(m);
                    }
                }
                members.Clear();
                IClass c = callingClass.DeclaringType;
                while (c != null)
                {
                    t = c.DefaultReturnType;
                    members.AddRange(t.GetMethods());
                    members.AddRange(t.GetFields());
                    members.AddRange(t.GetEvents());
                    members.AddRange(t.GetProperties());
                    c = c.DeclaringType;
                }
                foreach (IMember m in members)
                {
                    if (m.IsStatic)
                    {
                        result.Add(m);
                    }
                }
            }
        }
Exemplo n.º 2
0
        public static void AddUsing(ArrayList result, IUsing u, IProjectContent projectContent)
        {
            if (u == null)
            {
                return;
            }
            bool importNamespaces = projectContent.Language.ImportNamespaces;
            bool importClasses    = projectContent.Language.CanImportClasses;

            foreach (string name in u.Usings)
            {
                if (importClasses)
                {
                    IClass c = projectContent.GetClass(name, 0);
                    if (c != null)
                    {
                        ArrayList   members = new ArrayList();
                        IReturnType t       = c.DefaultReturnType;
                        members.AddRange(t.GetMethods());
                        members.AddRange(t.GetFields());
                        members.AddRange(t.GetEvents());
                        members.AddRange(t.GetProperties());
                        foreach (IMember m in members)
                        {
                            if (m.IsStatic && m.IsPublic)
                            {
                                result.Add(m);
                            }
                        }
                        continue;
                    }
                }
                if (importNamespaces)
                {
                    string newName = null;
                    if (projectContent.DefaultImports != null)
                    {
                        newName = projectContent.DefaultImports.SearchNamespace(name);
                    }
                    projectContent.AddNamespaceContents(result, newName ?? name, projectContent.Language, true);
                }
                else
                {
                    foreach (object o in projectContent.GetNamespaceContents(name))
                    {
                        if (!(o is string))
                        {
                            result.Add(o);
                        }
                    }
                }
            }
            if (u.HasAliases)
            {
                foreach (string alias in u.Aliases.Keys)
                {
                    result.Add(alias);
                }
            }
        }
Exemplo n.º 3
0
        public override List <IEvent> GetEvents()
        {
            if (_getMembersBusy)
            {
                return(new List <IEvent>());
            }
            _getMembersBusy = true;
            List <IEvent> l = new List <IEvent>();

            l.AddRange(_c.Events);
            if (_c.ClassType == ClassType.Interface)
            {
                foreach (IReturnType baseType in _c.BaseTypes)
                {
                    l.AddRange(baseType.GetEvents());
                }
            }
            else
            {
                IReturnType baseType = _c.BaseType;
                if (baseType != null)
                {
                    l.AddRange(baseType.GetEvents());
                }
            }
            _getMembersBusy = false;
            return(l);
        }
Exemplo n.º 4
0
        public override List <IEvent> GetEvents()
        {
            List <IEvent> l = new List <IEvent>();

            using (var busyLock = busyManager.Enter(this)) {
                if (busyLock.Success)
                {
                    l.AddRange(c.Events);
                    if (c.ClassType == ClassType.Interface)
                    {
                        foreach (IReturnType baseType in c.BaseTypes)
                        {
                            l.AddRange(baseType.GetEvents());
                        }
                    }
                    else
                    {
                        IReturnType baseType = c.BaseType;
                        if (baseType != null)
                        {
                            l.AddRange(baseType.GetEvents());
                        }
                    }
                }
            }
            return(l);
        }
Exemplo n.º 5
0
        MemberResolveResult ResolveProperty(string xmlNamespace, string className, string propertyName, bool allowAttached)
        {
            IProjectContent pc           = parseInfo.BestCompilationUnit.ProjectContent;
            IReturnType     resolvedType = XamlCompilationUnit.FindType(pc, xmlNamespace, className);

            if (resolvedType != null && resolvedType.GetUnderlyingClass() != null)
            {
                IMember member = resolvedType.GetProperties().Find(delegate(IProperty p) { return(p.Name == propertyName); });
                if (member == null)
                {
                    member = resolvedType.GetEvents().Find(delegate(IEvent p) { return(p.Name == propertyName); });
                }
                if (member == null && allowAttached)
                {
                    member = resolvedType.GetMethods().Find(
                        delegate(IMethod p) {
                        return(p.IsStatic && p.Parameters.Count == 1 && p.Name == "Get" + propertyName);
                    });
                }
                if (member != null)
                {
                    return(new MemberResolveResult(callingClass, null, member));
                }
            }
            return(null);
        }
Exemplo n.º 6
0
        public IMember GetMember(IReturnType type, string memberName)
        {
            if (type == null)
            {
                return(null);
            }
            bool isClassInInheritanceTree = false;

            if (callingClass != null)
            {
                isClassInInheritanceTree = callingClass.IsTypeInInheritanceTree(type.GetUnderlyingClass());
            }
            foreach (IProperty p in type.GetProperties())
            {
                if (IsSameName(p.Name, memberName))
                {
                    return(p);
                }
            }
            foreach (IField f in type.GetFields())
            {
                if (IsSameName(f.Name, memberName))
                {
                    return(f);
                }
            }
            foreach (IEvent e in type.GetEvents())
            {
                if (IsSameName(e.Name, memberName))
                {
                    return(e);
                }
            }
            return(null);
        }
Exemplo n.º 7
0
        public virtual List <IEvent> GetEvents()
        {
            IReturnType baseType = BaseType;

            using (var l = busyManager.Enter(this)) {
                return((l.Success && baseType != null) ? baseType.GetEvents() : new List <IEvent>());
            }
        }
Exemplo n.º 8
0
        public virtual List <IEvent> GetEvents()
        {
            IReturnType   baseType = BaseType;
            List <IEvent> tmp      = (baseType != null && TryEnter()) ? baseType.GetEvents() : new List <IEvent>();

            _busy = false;
            return(tmp);
        }
Exemplo n.º 9
0
        public static IEnumerable <IMember> GetMembers(this IReturnType typeReference)
        {
            var properties = typeReference.GetProperties().Cast <IMember>();
            var methods    = typeReference.GetMethods().Cast <IMember>();
            var fields     = typeReference.GetFields().Cast <IMember>();
            var events     = typeReference.GetEvents().Cast <IMember>();

            return(properties.Concat(methods).Concat(fields).Concat(events));
        }
Exemplo n.º 10
0
        public static List <IMember> GetAllMembers(IReturnType rt)
        {
            List <IMember> members = new List <IMember>();

            if (rt != null)
            {
                rt.GetMethods().ForEach(members.Add);
                rt.GetProperties().ForEach(members.Add);
                rt.GetFields().ForEach(members.Add);
                rt.GetEvents().ForEach(members.Add);
            }
            return(members);
        }
Exemplo n.º 11
0
        protected ArrayList GetCompletionData(LanguageProperties language, bool showStatic)
        {
            if (resolvedType == null)
            {
                return(null);
            }
            ArrayList res = new ArrayList();
            bool      isClassInInheritanceTree = false;

            if (callingClass != null)
            {
                isClassInInheritanceTree = callingClass.IsTypeInInheritanceTree(resolvedType.GetUnderlyingClass());
            }
            foreach (IMethod m in resolvedType.GetMethods())
            {
                if (language.ShowMember(m, showStatic) && m.IsAccessible(callingClass, isClassInInheritanceTree))
                {
                    res.Add(m);
                }
            }
            foreach (IEvent e in resolvedType.GetEvents())
            {
                if (language.ShowMember(e, showStatic) && e.IsAccessible(callingClass, isClassInInheritanceTree))
                {
                    res.Add(e);
                }
            }
            foreach (IField f in resolvedType.GetFields())
            {
                if (language.ShowMember(f, showStatic) && f.IsAccessible(callingClass, isClassInInheritanceTree))
                {
                    res.Add(f);
                }
            }
            foreach (IProperty p in resolvedType.GetProperties())
            {
                if (language.ShowMember(p, showStatic) && p.IsAccessible(callingClass, isClassInInheritanceTree))
                {
                    res.Add(p);
                }
            }

            if (!showStatic && callingClass != null)
            {
                AddExtensions(language, res, callingClass, resolvedType);
            }

            return(res);
        }
Exemplo n.º 12
0
        public override List <IEvent> GetEvents()
        {
            List <IEvent> l = baseType.GetEvents();

            for (int i = 0; i < l.Count; ++i)
            {
                if (CheckReturnType(l[i].ReturnType))
                {
                    l[i] = (IEvent)l[i].CreateSpecializedMember();
                    if (l[i].DeclaringType == baseType.GetUnderlyingClass())
                    {
                        l[i].DeclaringTypeReference = this;
                    }
                    l[i].ReturnType = TranslateType(l[i].ReturnType);
                }
            }
            return(l);
        }
Exemplo n.º 13
0
		static void AddAttributes(IReturnType rt, IList<ICompletionItem> list, bool includeEvents)
		{
			if (rt == null)
				return;
			
			foreach (IProperty p in rt.GetProperties()) {
				if (p.IsPublic && (p.IsPubliclySetable() || p.ReturnType.IsCollectionReturnType()))
					list.Add(new XamlCodeCompletionItem(p));
			}
			
			if (includeEvents) {
				foreach (IEvent e in rt.GetEvents()) {
					if (e.IsPublic) {
						list.Add(new XamlCodeCompletionItem(e));
					}
				}
			}
		}
Exemplo n.º 14
0
		MemberResolveResult ResolvePropertyName(IReturnType resolvedType, string propertyName, bool allowAttached)
		{
			IMember member = resolvedType.GetProperties().Find(delegate(IProperty p) { return p.Name == propertyName; });
			if (member == null) {
				member = resolvedType.GetEvents().Find(delegate(IEvent p) { return p.Name == propertyName; });
			}
			if (member == null && allowAttached) {
				IMethod method = resolvedType.GetMethods().Find(
					delegate(IMethod p) {
						return p.IsStatic && p.Parameters.Count == 1 && p.Name == "Get" + propertyName;
					});
				member = method;
				if (member != null) {
					member = new DefaultProperty(resolvedType.GetUnderlyingClass(), propertyName) { ReturnType = method.ReturnType };
				} else {
					IMethod m = resolvedType.GetMethods().Find(
						delegate(IMethod p) {
							return p.IsPublic && p.IsStatic && p.Parameters.Count == 2 && (p.Name == "Add" + propertyName + "Handler" || p.Name == "Remove" + propertyName + "Handler");
						});
					member = m;
					if (member != null)
						member = new DefaultEvent(resolvedType.GetUnderlyingClass(), propertyName) { ReturnType = m.Parameters[1].ReturnType };
				}
			}
			if (member != null)
				return new MemberResolveResult(callingClass, null, member);
			return null;
		}
Exemplo n.º 15
0
		bool ResolveMember(IReturnType type, string memberName)
		{
			ClearResult();
			if (type == null)
				return false;
			bool isClassInInheritanceTree = false;
			if (callingClass != null)
				isClassInInheritanceTree = callingClass.IsTypeInInheritanceTree(type.GetUnderlyingClass());
			foreach (IProperty p in type.GetProperties()) {
				if (IsSameName(p.Name, memberName)) {
					MakeResult(p);
					return true;
				}
			}
			foreach (IField f in type.GetFields()) {
				if (IsSameName(f.Name, memberName)) {
					MakeResult(f);
					return true;
				}
			}
			foreach (IEvent e in type.GetEvents()) {
				if (IsSameName(e.Name, memberName)) {
					MakeResult(e);
					return true;
				}
			}
			foreach (IMethod m in type.GetMethods()) {
				if (IsSameName(m.Name, memberName)) {
					MakeMethodResult(type, memberName);
					return true;
				}
			}
			if (callingClass != null) {
				List<IMethodOrProperty> list = new List<IMethodOrProperty>();
				ResolveResult.AddExtensions(callingClass.ProjectContent.Language, list.Add, callingClass, type);
				foreach (IMethodOrProperty mp in list) {
					if (IsSameName(mp.Name, memberName)) {
						if (mp is IMethod)
							MakeMethodResult(type, memberName);
						else
							MakeResult(mp);
						return true;
					}
				}
			}
			return false;
		}
Exemplo n.º 16
0
        bool ResolveMember(IReturnType type, string memberName)
        {
            ClearResult();
            if (type == null)
            {
                return(false);
            }
            bool isClassInInheritanceTree = false;

            if (callingClass != null)
            {
                isClassInInheritanceTree = callingClass.IsTypeInInheritanceTree(type.GetUnderlyingClass());
            }
            foreach (IProperty p in type.GetProperties())
            {
                if (IsSameName(p.Name, memberName))
                {
                    MakeResult(p);
                    return(true);
                }
            }
            foreach (IField f in type.GetFields())
            {
                if (IsSameName(f.Name, memberName))
                {
                    MakeResult(f);
                    return(true);
                }
            }
            foreach (IEvent e in type.GetEvents())
            {
                if (IsSameName(e.Name, memberName))
                {
                    MakeResult(e);
                    return(true);
                }
            }
            foreach (IMethod m in type.GetMethods())
            {
                if (IsSameName(m.Name, memberName))
                {
                    MakeMethodResult(type, memberName);
                    return(true);
                }
            }
            if (callingClass != null)
            {
                ArrayList list = new ArrayList();
                ResolveResult.AddExtensions(callingClass.ProjectContent.Language, list, callingClass, type);
                foreach (IMethodOrProperty mp in list)
                {
                    if (IsSameName(mp.Name, memberName))
                    {
                        if (mp is IMethod)
                        {
                            MakeMethodResult(type, memberName);
                        }
                        else
                        {
                            MakeResult(mp);
                        }
                        return(true);
                    }
                }
            }
            return(false);
        }
        /// <summary>
        /// Adds the methods implementing the <paramref name="interf"/> to the list
        /// <paramref name="nodes"/>.
        /// </summary>
        public virtual void ImplementInterface(IList <AbstractNode> nodes, IReturnType interf, bool explicitImpl, IClass targetClass)
        {
            ClassFinder   context = new ClassFinder(targetClass, targetClass.Region.BeginLine + 1, 0);
            Modifiers     implicitImplModifier = ConvertModifier(ModifierEnum.Public, context);
            Modifiers     explicitImplModifier = ConvertModifier(context.Language.ExplicitInterfaceImplementationIsPrivateScope ? ModifierEnum.None : ModifierEnum.Public, context);
            List <IEvent> targetClassEvents    = targetClass.DefaultReturnType.GetEvents();
            bool          requireAlternativeImplementation;

            foreach (IEvent e in interf.GetEvents())
            {
                if (!InterfaceMemberAlreadyImplemented(targetClassEvents, e, out requireAlternativeImplementation))
                {
                    EventDeclaration ed = ConvertMember(e, context);
                    ed.Attributes.Clear();
                    if (explicitImpl || requireAlternativeImplementation)
                    {
                        ed.InterfaceImplementations.Add(CreateInterfaceImplementation(e, context));

                        if (context.Language.RequiresAddRemoveRegionInExplicitInterfaceImplementation)
                        {
                            ed.AddRegion          = new EventAddRegion(null);
                            ed.AddRegion.Block    = CreateNotImplementedBlock();
                            ed.RemoveRegion       = new EventRemoveRegion(null);
                            ed.RemoveRegion.Block = CreateNotImplementedBlock();
                        }

                        targetClassEvents.Add(CloneAndAddExplicitImpl(e, targetClass));
                        ed.Modifier = explicitImplModifier;
                    }
                    else
                    {
                        targetClassEvents.Add(e);
                        ed.Modifier = implicitImplModifier;
                    }
                    nodes.Add(ed);
                }
            }
            List <IProperty> targetClassProperties = targetClass.DefaultReturnType.GetProperties();

            foreach (IProperty p in interf.GetProperties())
            {
                if (!InterfaceMemberAlreadyImplemented(targetClassProperties, p, out requireAlternativeImplementation))
                {
                    AttributedNode pd = ConvertMember(p, context);
                    pd.Attributes.Clear();
                    if (explicitImpl || requireAlternativeImplementation)
                    {
                        InterfaceImplementation impl = CreateInterfaceImplementation(p, context);
                        if (pd is IndexerDeclaration)
                        {
                            ((IndexerDeclaration)pd).InterfaceImplementations.Add(impl);
                        }
                        else
                        {
                            ((PropertyDeclaration)pd).InterfaceImplementations.Add(impl);
                        }
                        targetClassProperties.Add(CloneAndAddExplicitImpl(p, targetClass));
                        pd.Modifier = explicitImplModifier;
                    }
                    else
                    {
                        targetClassProperties.Add(p);
                        pd.Modifier = implicitImplModifier;
                    }
                    nodes.Add(pd);
                }
            }
            List <IMethod> targetClassMethods = targetClass.DefaultReturnType.GetMethods();

            foreach (IMethod m in interf.GetMethods())
            {
                if (!InterfaceMemberAlreadyImplemented(targetClassMethods, m, out requireAlternativeImplementation))
                {
                    MethodDeclaration md = ConvertMember(m, context) as MethodDeclaration;
                    md.Attributes.Clear();
                    if (md != null)
                    {
                        if (explicitImpl || requireAlternativeImplementation)
                        {
                            md.InterfaceImplementations.Add(CreateInterfaceImplementation(m, context));
                            targetClassMethods.Add(CloneAndAddExplicitImpl(m, targetClass));
                            md.Modifier = explicitImplModifier;
                        }
                        else
                        {
                            targetClassMethods.Add(m);
                            md.Modifier = implicitImplModifier;
                        }
                        nodes.Add(md);
                    }
                }
            }
        }
        static void DoSetterAndEventSetterCompletion(XamlCompletionContext context, XamlCompletionItemList completionList)
        {
            bool           isExplicit;
            string         element = context.ParentElement.Name.EndsWith("Trigger") ? "Trigger" : context.ParentElement.Name;
            AttributeValue value   = MarkupExtensionParser.ParseValue(CompletionDataHelper.LookForTargetTypeValue(context, out isExplicit, element) ?? string.Empty);

            IReturnType typeName       = null;
            string      typeNameString = null;

            if (!value.IsString)
            {
                typeNameString = CompletionDataHelper.GetTypeNameFromTypeExtension(value.ExtensionValue, context);
                typeName       = CompletionDataHelper.ResolveType(typeNameString, context);
            }
            else
            {
                typeNameString = value.StringValue;
                typeName       = CompletionDataHelper.ResolveType(value.StringValue, context);
            }

            if (typeName != null)
            {
                switch (context.Attribute.Name)
                {
                case "Value":
                    AttributeValue propType = MarkupExtensionParser.ParseValue(context.ActiveElement.GetAttributeValue("Property") ?? "");

                    if (!propType.IsString)
                    {
                        break;
                    }

                    context.Description = XamlContextDescription.AtTag;

                    string name = propType.StringValue;

                    if (!name.Contains("."))
                    {
                        name = typeNameString + "." + name;
                    }

                    var member = XamlResolver.Resolve(name, context) as MemberResolveResult;

                    if (member == null || member.ResolvedMember == null)
                    {
                        break;
                    }

                    completionList.Items.AddRange(
                        CompletionDataHelper.MemberCompletion(context, member.ResolvedMember.ReturnType, string.Empty)
                        );
                    break;

                case "Property":
                    completionList.Items.AddRange(
                        typeName.GetProperties()
                        .Where(p => p.IsPublic && p.CanSet)
                        .Select(prop => new XamlCodeCompletionItem(prop))
                        );
                    break;

                case "Event":
                    completionList.Items.AddRange(
                        typeName.GetEvents()
                        .Where(e => e.IsPublic)
                        .Select(evt => new XamlCodeCompletionItem(evt))
                        );
                    break;

                case "Handler":
                    var            loc3    = context.Editor.Document.OffsetToPosition(XmlParser.GetActiveElementStartIndex(context.Editor.Document.Text, context.Editor.Caret.Offset));
                    AttributeValue evtType = MarkupExtensionParser.ParseValue(context.ActiveElement.GetAttributeValue("Event") ?? "");
                    if (!evtType.IsString)
                    {
                        break;
                    }

                    string evtName = evtType.StringValue;

                    if (!evtName.Contains("."))
                    {
                        evtName = typeNameString + "." + evtName;
                    }

                    var evtMember = XamlResolver.Resolve(evtName, context) as MemberResolveResult;

                    if (evtMember == null || evtMember.ResolvedMember == null || !(evtMember.ResolvedMember is IEvent) || evtMember.ResolvedMember.ReturnType == null)
                    {
                        break;
                    }

                    IClass c = (evtMember.ResolvedMember as IEvent).ReturnType.GetUnderlyingClass();

                    if (c == null)
                    {
                        break;
                    }

                    IMethod invoker = c.Methods.FirstOrDefault(m => m.Name == "Invoke");

                    if (invoker == null)
                    {
                        break;
                    }

                    completionList.Items.AddRange(
                        CompletionDataHelper.AddMatchingEventHandlers(context, invoker).Add(new NewEventCompletionItem(evtMember.ResolvedMember as IEvent, typeName.Name))
                        );
                    break;
                }
            }
        }
Exemplo n.º 19
0
        MemberResolveResult ResolvePropertyName(IReturnType resolvedType, string propertyName, bool allowAttached)
        {
            IMember member = resolvedType.GetProperties().Find(delegate(IProperty p) { return(p.Name == propertyName); });

            if (member == null)
            {
                member = resolvedType.GetEvents().Find(delegate(IEvent p) { return(p.Name == propertyName); });
            }
            if (member == null && allowAttached)
            {
                IMethod method = resolvedType.GetMethods().Find(
                    delegate(IMethod p) {
                    return(p.IsStatic && p.Parameters.Count == 1 && p.Name == "Get" + propertyName);
                });
                member = method;
                if (member != null)
                {
                    member = new DefaultProperty(resolvedType.GetUnderlyingClass(), propertyName)
                    {
                        ReturnType = method.ReturnType
                    };
                }
                else
                {
                    IMethod m = resolvedType.GetMethods().Find(
                        delegate(IMethod p) {
                        return(p.IsPublic && p.IsStatic && p.Parameters.Count == 2 && (p.Name == "Add" + propertyName + "Handler" || p.Name == "Remove" + propertyName + "Handler"));
                    });
                    member = m;
                    if (member != null)
                    {
                        member = new DefaultEvent(resolvedType.GetUnderlyingClass(), propertyName)
                        {
                            ReturnType = m.Parameters[1].ReturnType
                        }
                    }
                    ;
                }
            }
            if (member != null)
            {
                return(new MemberResolveResult(callingClass, null, member));
            }
            return(null);
        }

        MemberResolveResult ResolveAttribute(string attributeName)
        {
            if (context.ActiveElement == null)
            {
                return(null);
            }
            string attributeXmlNamespace;

            if (attributeName.Contains(":"))
            {
                string prefix = attributeName.Substring(0, attributeName.IndexOf(':'));
                if (!context.XmlnsDefinitions.TryGetValue(prefix, out attributeXmlNamespace))
                {
                    attributeXmlNamespace = null;
                }
                attributeName = attributeName.Substring(attributeName.IndexOf(':') + 1);
            }
            else
            {
                if (!context.XmlnsDefinitions.TryGetValue("", out attributeXmlNamespace))
                {
                    attributeXmlNamespace = null;
                }
            }
            if (attributeName.Contains("."))
            {
                string className = attributeName.Substring(0, attributeName.IndexOf('.'));
                attributeName = attributeName.Substring(attributeName.IndexOf('.') + 1);
                return(ResolveProperty(attributeXmlNamespace, className, attributeName, true));
            }
            else
            {
                var lastElement = context.ActiveElement;
                return(ResolveProperty(lastElement.Namespace, lastElement.LocalName, attributeName, false));
            }
        }

        ResolveResult ResolveAttributeValue(IMember propertyOrEvent, string expression)
        {
            if (propertyOrEvent == null)
            {
                return(null);
            }
            if (propertyOrEvent is IEvent && callingClass != null)
            {
                return(new MethodGroupResolveResult(callingClass, null, callingClass.DefaultReturnType, expression));
            }
            else if (propertyOrEvent is IProperty && callingClass != null)
            {
                if (propertyOrEvent.Name == "Name")
                {
                    foreach (IField f in callingClass.Fields)
                    {
                        if (f.Name == expression)
                        {
                            return(new MemberResolveResult(callingClass, null, f));
                        }
                    }
                }
                return(ResolveElementName(expression));
            }

            IReturnType type = propertyOrEvent.ReturnType;

            if (type == null)
            {
                return(null);
            }
            IClass c = type.GetUnderlyingClass();

            if (c == null)
            {
                return(null);
            }

            if (c.ClassType == ClassType.Enum)
            {
                foreach (IField f in c.Fields)
                {
                    if (f.Name == expression)
                    {
                        return(new MemberResolveResult(callingClass, null, f));
                    }
                }
            }
            return(null);
        }