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); } }
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); } } }
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()); } } } } }