internal static PSMemberInfo ResolveAlias(PSAliasProperty alias, DynamicMetaObject target, HashSet <string> aliases, List <BindingRestrictions> aliasRestrictions) { bool flag; Type type; BindingRestrictions restrictions; if (aliases == null) { aliases = new HashSet <string> { alias.Name }; } else { if (aliases.Contains(alias.Name)) { throw new ExtendedTypeSystemException("CycleInAliasLookup", null, ExtendedTypeSystem.CycleInAlias, new object[] { alias.Name }); } aliases.Add(alias.Name); } PSGetMemberBinder binder = Get(alias.ReferencedMemberName, false); if (binder.HasInstanceMember) { return(null); } PSMemberInfo info = binder.GetPSMemberInfo(target, out restrictions, out flag, out type, aliases, aliasRestrictions); aliasRestrictions.Add(BinderUtils.GetVersionCheck(binder, binder._version)); return(info); }
internal override IEnumerable <PSTypeName> GetInferredType(CompletionContext context) { StringConstantExpressionAst member = this.Member as StringConstantExpressionAst; if (member != null) { PSTypeName[] iteratorVariable1; if (this.Static) { TypeExpressionAst expression = this.Expression as TypeExpressionAst; if (expression == null) { goto Label_064A; } Type type = expression.TypeName.GetReflectionType(); if (type == null) { goto Label_064A; } iteratorVariable1 = new PSTypeName[] { new PSTypeName(type) }; } else { iteratorVariable1 = this.Expression.GetInferredType(context).ToArray <PSTypeName>(); if (iteratorVariable1.Length == 0) { goto Label_064A; } } List <string> iteratorVariable2 = new List <string> { member.Value }; foreach (PSTypeName iteratorVariable3 in iteratorVariable1) { IEnumerable <object> iteratorVariable4 = CompletionCompleters.GetMembersByInferredType(iteratorVariable3, this.Static, context); for (int i = 0; i < iteratorVariable2.Count; i++) { string iteratorVariable6 = iteratorVariable2[i]; foreach (object iteratorVariable7 in iteratorVariable4) { PropertyInfo iteratorVariable8 = iteratorVariable7 as PropertyInfo; if (iteratorVariable8 != null) { if (iteratorVariable8.Name.Equals(iteratorVariable6, StringComparison.OrdinalIgnoreCase) && !(this is InvokeMemberExpressionAst)) { yield return(new PSTypeName(iteratorVariable8.PropertyType)); break; } } else { FieldInfo iteratorVariable9 = iteratorVariable7 as FieldInfo; if (iteratorVariable9 != null) { if (iteratorVariable9.Name.Equals(iteratorVariable6, StringComparison.OrdinalIgnoreCase) && !(this is InvokeMemberExpressionAst)) { yield return(new PSTypeName(iteratorVariable9.FieldType)); break; } continue; } DotNetAdapter.MethodCacheEntry iteratorVariable10 = iteratorVariable7 as DotNetAdapter.MethodCacheEntry; if (iteratorVariable10 != null) { if (iteratorVariable10[0].method.Name.Equals(iteratorVariable6, StringComparison.OrdinalIgnoreCase)) { if (!(this is InvokeMemberExpressionAst)) { yield return(new PSTypeName(typeof(PSMethod))); break; } foreach (MethodInformation iteratorVariable11 in iteratorVariable10.methodInformationStructures) { MethodInfo method = iteratorVariable11.method as MethodInfo; if ((method != null) && !method.ReturnType.ContainsGenericParameters) { yield return(new PSTypeName(method.ReturnType)); } } break; } continue; } PSMemberInfo iteratorVariable13 = iteratorVariable7 as PSMemberInfo; if ((iteratorVariable13 != null) && iteratorVariable13.Name.Equals(iteratorVariable6, StringComparison.OrdinalIgnoreCase)) { PSNoteProperty iteratorVariable14 = iteratorVariable7 as PSNoteProperty; if (iteratorVariable14 != null) { yield return(new PSTypeName(iteratorVariable14.Value.GetType())); break; } PSAliasProperty iteratorVariable15 = iteratorVariable7 as PSAliasProperty; if (iteratorVariable15 != null) { iteratorVariable2.Add(iteratorVariable15.ReferencedMemberName); } else { PSCodeProperty iteratorVariable16 = iteratorVariable7 as PSCodeProperty; if (iteratorVariable16 != null) { if (iteratorVariable16.GetterCodeReference != null) { yield return(new PSTypeName(iteratorVariable16.GetterCodeReference.ReturnType)); break; } } else { ScriptBlock getterScript = null; PSScriptProperty iteratorVariable18 = iteratorVariable7 as PSScriptProperty; if (iteratorVariable18 != null) { getterScript = iteratorVariable18.GetterScript; } PSScriptMethod iteratorVariable19 = iteratorVariable7 as PSScriptMethod; if (iteratorVariable19 != null) { getterScript = iteratorVariable19.Script; } if (getterScript != null) { foreach (PSTypeName iteratorVariable20 in getterScript.OutputType) { yield return(iteratorVariable20); } } } } break; } } } } } } Label_064A: yield break; }
internal PSMemberInfo GetPSMemberInfo(DynamicMetaObject target, out BindingRestrictions restrictions, out bool canOptimize, out Type aliasConversionType, HashSet <string> aliases = null, List <BindingRestrictions> aliasRestrictions = null) { lock (this) { aliasConversionType = null; if (this._static) { restrictions = typeof(Type).IsAssignableFrom(target.LimitType) ? BindingRestrictions.GetInstanceRestriction(target.Expression, target.Value) : target.PSGetTypeRestriction(); restrictions = restrictions.Merge(BinderUtils.GetVersionCheck(this, this._version)); canOptimize = true; return(PSObject.GetStaticCLRMember(target.Value, base.Name)); } canOptimize = false; PSMemberInfo info = null; ConsolidatedString types = null; ExecutionContext executionContextFromTLS = LocalPipeline.GetExecutionContextFromTLS(); TypeTable typeTable = (executionContextFromTLS != null) ? executionContextFromTLS.TypeTable : null; if (this._hasTypeTableMember) { types = PSObject.GetTypeNames(target.Value); if (typeTable != null) { info = typeTable.GetMembers <PSMemberInfo>(types)[base.Name]; if (info != null) { canOptimize = true; } } } object obj2 = PSObject.Base(target.Value); PSObject.AdapterSet mappedAdapter = PSObject.GetMappedAdapter(obj2, typeTable); if (info == null) { canOptimize = mappedAdapter.OriginalAdapter.SiteBinderCanOptimize; if (canOptimize) { info = mappedAdapter.OriginalAdapter.BaseGetMember <PSMemberInfo>(obj2, base.Name); } } if (((info == null) && canOptimize) && (mappedAdapter.DotNetAdapter != null)) { info = mappedAdapter.DotNetAdapter.BaseGetMember <PSMemberInfo>(obj2, base.Name); } restrictions = BinderUtils.GetVersionCheck(this, this._version); PSAliasProperty alias = info as PSAliasProperty; if (alias != null) { aliasConversionType = alias.ConversionType; if (aliasRestrictions == null) { aliasRestrictions = new List <BindingRestrictions>(); } info = ResolveAlias(alias, target, aliases, aliasRestrictions); if (info == null) { canOptimize = false; } else { foreach (BindingRestrictions restrictions2 in aliasRestrictions) { restrictions = restrictions.Merge(restrictions2); } } } if (this._hasInstanceMember) { restrictions = restrictions.Merge(this.NotInstanceMember(target)); } restrictions = restrictions.Merge(target.PSGetTypeRestriction()); if (this._hasTypeTableMember) { restrictions = restrictions.Merge(BindingRestrictions.GetInstanceRestriction(Expression.Call(CachedReflectionInfo.PSGetMemberBinder_GetTypeTableFromTLS, new Expression[0]), typeTable)); restrictions = restrictions.Merge(BindingRestrictions.GetExpressionRestriction(Expression.Call(CachedReflectionInfo.PSGetMemberBinder_IsTypeNameSame, target.Expression.Cast(typeof(object)), Expression.Constant(types.Key)))); } return(info); } }