FazBrowse GitHub Viewer | Trending |
URL:
| Home
Tools: [Download Repo ZIP]   [Original HTTPS Page]

GitHub Viewer

// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using Microsoft.ClearScript.Util; namespace Microsoft.ClearScript { internal sealed class ExtensionMethodTable { private readonly Dictionary table = new Dictionary(); public ExtensionMethodSummary Summary { get; private set; } = new ExtensionMethodSummary(); public bool ProcessType(Type type, Type accessContext, ScriptAccess defaultAccess) { Debug.Assert(type.IsSpecific()); if (!table.ContainsKey(type) && type.HasExtensionMethods()) { const BindingFlags bindFlags = BindingFlags.Public | BindingFlags.Static; table[type] = type.GetMethods(bindFlags).Where(method => IsScriptableExtensionMethod(method, accessContext, defaultAccess)).ToArray(); RebuildSummary(); return true; } return false; } public void RebuildSummary() { Summary = new ExtensionMethodSummary(table); } private static bool IsScriptableExtensionMethod(MethodInfo method, Type accessContext, ScriptAccess defaultAccess) { return method.IsScriptable(accessContext, defaultAccess) && method.IsDefined(typeof(ExtensionAttribute), false); } } internal sealed class ExtensionMethodSummary { public ExtensionMethodSummary() { Types = ArrayHelpers.GetEmptyArray(); Methods = ArrayHelpers.GetEmptyArray(); MethodNames = ArrayHelpers.GetEmptyArray(); } public ExtensionMethodSummary(Dictionary table) { Types = table.Keys.ToArray(); Methods = table.SelectMany(pair => pair.Value).ToArray(); MethodNames = Methods.Select(method => method.GetScriptName()).ToArray(); } public Type[] Types { get; } public MethodInfo[] Methods { get; } public string[] MethodNames { get; } } }

Back | FazBrowse Home | New Git URL