Beispiel #1
0
    public override void ResolveAttributeMember(SyntaxTreeNode_Leaf leaf, Scope_Base context)
    {
        if (resolvingMember)
        {
            return;
        }
        resolvingMember = true;

        leaf.ResolvedSymbol = null;
        base.ResolveAttributeMember(leaf, context);

        resolvingMember = false;

        if (leaf.ResolvedSymbol == null)
        {
            var assemblyDefinition = context.GetAssembly();
            assemblyDefinition.ResolveAttributeInReferencedAssemblies(leaf, this);
        }
    }
Beispiel #2
0
    public override void ResolveMember(SyntaxTreeNode_Leaf leaf, Scope_Base context, int numTypeArgs, bool asTypeOnly)
    {
        if (resolvingMember)
        {
            return;
        }
        resolvingMember = true;

        leaf.ResolvedSymbol = null;

        base.ResolveMember(leaf, context, numTypeArgs, asTypeOnly);

        resolvingMember = false;

        if (leaf.ResolvedSymbol == null)
        {
            if (context != null)
            {
                var assemblyDefinition = context.GetAssembly();
                assemblyDefinition.ResolveInReferencedAssemblies(leaf, this, numTypeArgs);
            }
        }
    }
Beispiel #3
0
    public void CollectExtensionMethods(
        string id,
        SymbolReference[] typeArgs,
        TypeDefinitionBase extendedType,
        HashSet <MethodDefinition> extensionsMethods,
        Scope_Base context)
    {
        var numTypeArguments = typeArgs == null ? -1 : typeArgs.Length;

        var contextAssembly = context.GetAssembly();

        for (var i = members.Count; i-- > 0;)
        {
            var typeDefinition = members[i];
            if (typeDefinition.kind != SymbolKind.Class || !typeDefinition.IsValid() || (typeDefinition as TypeDefinitionBase).numExtensionMethods == 0 || !typeDefinition.IsStatic || typeDefinition.NumTypeParameters > 0)
            {
                continue;
            }

            var accessLevelMask = AccessLevelMask.Public;
            if (typeDefinition.Assembly != null && typeDefinition.Assembly.InternalsVisibleIn(contextAssembly))
            {
                accessLevelMask |= AccessLevelMask.Internal;
            }

            if (!typeDefinition.IsAccessible(accessLevelMask))
            {
                continue;
            }

            SymbolDefinition member;
            if (typeDefinition.members.TryGetValue(id, numTypeArguments, out member))
            {
                if (member.kind == SymbolKind.MethodGroup)
                {
                    var methodGroup = member as SD_MethodGroup;
                    if (methodGroup != null)
                    {
                        foreach (var method in methodGroup.methods)
                        {
                            if (method.IsExtensionMethod && method.IsAccessible(accessLevelMask))
                            {
                                var extendsType = method.parameters[0].TypeOf() as TypeDefinitionBase;
                                if (extendedType.CanConvertTo(extendsType))
                                {
                                    if (numTypeArguments > 0)
                                    {
                                        var constructedMethod = method.ConstructMethod(typeArgs);
                                        extensionsMethods.Add(constructedMethod);
                                    }
                                    else
                                    {
                                        extensionsMethods.Add(method);
                                    }
                                }
                            }
                        }
                    }
                    else
                    {
                        Debug.LogError("Expected a method group: " + member.GetTooltipText());
                    }
                }
            }
        }
    }