internal static void InitializeWellKnownMembers() { var memberSymbols = new MemberSymbol[MemberNames.Length]; foreach (var m in (WellKnownMembers[])Enum.GetValues(typeof(WellKnownMembers))) { var names = MemberNames[(int)m]; Debug.Assert(m.ToString().StartsWith(names.Replace("global::", "").Replace('.', '_').Replace("`", "_T").Replace("$", "").Replace("@", "").Split('|', '(').First())); foreach (var proto in names.Split('|')) { var name = proto.Replace("$", "").Split('(').First(); var s = Binder.LookupFullName(name.Replace("global::", "").Split('.').Select(n => n.Replace('@', '.')).ToArray()); if (s == null) { continue; } if (s is SymbolList) { var isStatic = proto.Contains('$'); var args = proto.Replace(")", "").Split('(').Last().Split(','); var argTypes = args.Select(x => Binder.LookupFullName(x) as TypeSymbol).ToArray(); s = (s as SymbolList).Symbols.Find(x => (x as MethodBaseSymbol)?.MethodBase.GetParameters().Length == args.Length && (x as MethodBaseSymbol)?.MethodBase.IsStatic == isStatic && (x as MethodBaseSymbol)?.MethodBase.GetParameters().All(y => args[y.Position] == "*" || y.ParameterType == argTypes[y.Position].Type) == true); Debug.Assert(s is MethodBaseSymbol); } Debug.Assert(s is MemberSymbol); memberSymbols[(int)m] = s as MemberSymbol; break; } Debug.Assert(memberSymbols[(int)m] != null); } Interlocked.CompareExchange(ref WellKnownMemberSymbols, memberSymbols, null); }
internal static void InitializeNativeTypes() { var nativeTypeSymbols = new TypeSymbol[NativeTypeNames.Length]; foreach (var m in (NativeType[])Enum.GetValues(typeof(NativeType))) { var names = NativeTypeNames[(int)m]; nativeTypeSymbols[(int)m] = null; if (!string.IsNullOrEmpty(names)) { Debug.Assert(names.Substring(names.LastIndexOf('.') + 1) .Replace("__", "").Split('|', '(').First() .Replace("Void*", "Ptr") == m.ToString()); foreach (var name in names.Split('|')) { var t = Binder.LookupFullName(name) as TypeSymbol; Debug.Assert(t != null); if (t == null) { continue; } t.NativeType = m; nativeTypeSymbols[(int)m] = t; break; } } } Interlocked.CompareExchange(ref NativeTypeSymbols, nativeTypeSymbols, null); }
// Useful for testing internal static bool Override(WellKnownMembers kind, string proto) { var name = proto.Replace("$", "").Split('(').First(); var s = Binder.LookupName(name); if (s == null) { return(false); } if (s is SymbolList) { var isStatic = proto.Contains('$'); var args = proto.Replace(")", "").Split('(').Last().Split(','); var argTypes = args.Select(x => Binder.LookupFullName(x) as TypeSymbol).ToArray(); s = (s as SymbolList).Symbols.Find(x => (x as MethodBaseSymbol)?.MethodBase.GetParameters().Length == args.Length && (x as MethodBaseSymbol)?.MethodBase.IsStatic == isStatic && (x as MethodBaseSymbol)?.MethodBase.GetParameters().All(y => args[y.Position] == "*" || y.ParameterType == argTypes[y.Position].Type) == true); if (!(s is MethodBaseSymbol)) { return(false); } } if (!(s is MemberSymbol)) { return(false); } WellKnownMemberSymbols[(int)kind] = s as MemberSymbol; return(true); }
static MemberSymbol FindMember(string names) { foreach (var proto in names.Split('|')) { var name = proto.Replace("$", "").Split('(').First(); var s = Binder.LookupFullName(name.Replace("global::", "").Split('.').Select(n => n.Replace('@', '.')).ToArray()); if (s == null) { continue; } if (s is SymbolList) { var isStatic = proto.Contains('$'); var args = proto.Replace(")", "").Split('(').Last().Split(','); var argTypes = args.Select(x => Binder.LookupFullName(x) as TypeSymbol).ToArray(); s = (s as SymbolList).Symbols.Find(x => (x as MethodBaseSymbol)?.MethodBase.GetParameters().Length == args.Length && (x as MethodBaseSymbol)?.MethodBase.IsStatic == isStatic && (x as MethodBaseSymbol)?.MethodBase.GetParameters().All(y => args[y.Position] == "*" || y.ParameterType == argTypes[y.Position].Type) == true); Debug.Assert(s is MethodBaseSymbol); } Debug.Assert(s is MemberSymbol); return(s as MemberSymbol); } return(null); }
internal static void InitializeWellKnownTypes() { var typeSymbols = new TypeSymbol[TypeNames.Length]; foreach (var m in (WellKnownTypes[])Enum.GetValues(typeof(WellKnownTypes))) { var names = TypeNames[(int)m]; Debug.Assert(names.Replace('.', '_').Replace("`", "_T").Split('|').First().Contains(m.ToString())); foreach (var name in names.Split('|')) { var s = Binder.LookupFullName(name); if (s == null) { continue; } Debug.Assert(s is TypeSymbol); typeSymbols[(int)m] = s as TypeSymbol; break; } Debug.Assert(typeSymbols[(int)m] != null); } Interlocked.CompareExchange(ref WellKnownTypeSymbols, typeSymbols, null); }