8000 Adding support for Typeinference based on runtime variable values by powercode · Pull Request #2744 · PowerShell/PowerShell · GitHub
[go: up one dir, main page]

Skip to content

Adding support for Typeinference based on runtime variable values #2744

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 19 commits into from
Jun 7, 2017
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
GetMembersByInferredType -> TypeInferenceContext instance
  • Loading branch information
Staffan Gustafsson committed Apr 28, 2017
commit f72ccceb0ceb631632090e86f3ed8075f092df53
Original file line number Diff line number Diff line change
Expand Up @@ -5163,7 +5163,7 @@ private static void CompleteMemberByInferredType(CompletionContext context, IEnu
continue;
}
typeNameUsed.Add(psTypeName.Name);
var members = TypeInferenceContext.GetMembersByInferredType(context.TypeInferenceContext, psTypeName, isStatic, filter);
var members = context.TypeInferenceContext.GetMembersByInferredType(psTypeName, isStatic, filter);
foreach (var member in members)
{
AddInferredMember(member, memberNamePattern, results);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -144,38 +144,38 @@ public bool TryGetRepresentativeTypeNameFromExpressionSafeEval(ExpressionAst exp
TryGetRepresentativeTypeNameFromValue(value, out typeName);
}

internal static IList<object> GetMembersByInferredType(TypeInferenceContext typeInferenceContext, PSTypeName typename, bool isStatic, Func<object, bool> filter)
internal IList<object> GetMembersByInferredType(PSTypeName typename, bool isStatic, Func<object, bool> filter)
{
List<object> results = new List<object>();

Func<object, bool> filterToCall = filter;
if (typename.Type != null)
{
AddMembersByInferredTypesClrType(typeInferenceContext, typename, isStatic, filter, filterToCall, results);
AddMembersByInferredTypesClrType(typename, isStatic, filter, filterToCall, results);
}
else if (typename.TypeDefinitionAst != null)
{
AddMembersByInferredTypeDefinitionAst(typeInferenceContext, typename, isStatic, filter, filterToCall, results);
AddMembersByInferredTypeDefinitionAst(typename, isStatic, filter, filterToCall, results);
}
else
{
// Look in the type table first.
if (!isStatic)
{
var consolidatedString = new ConsolidatedString(new[] { typename.Name });
results.AddRange(typeInferenceContext.ExecutionContext.TypeTable.GetMembers<PSMemberInfo>(consolidatedString));
results.AddRange(ExecutionContext.TypeTable.GetMembers<PSMemberInfo>(consolidatedString));
}

AddMembersByInferredTypeCimType(typeInferenceContext, typename, results, filterToCall);
AddMembersByInferredTypeCimType(typename, results, filterToCall);
}

return results;
}


private static void AddMembersByInferredTypesClrType(TypeInferenceContext typeInferenceContext, PSTypeName typename, bool isStatic, Func<object, bool> filter, Func<object, bool> filterToCall, List<object> results)
internal void AddMembersByInferredTypesClrType(PSTypeName typename, bool isStatic, Func<object, bool> filter, Func<object, bool> filterToCall, List<object> results)
{
if (typeInferenceContext.CurrentTypeDefinitionAst == null || typeInferenceContext.CurrentTypeDefinitionAst.Type != typename.Type)
if (CurrentTypeDefinitionAst == null || CurrentTypeDefinitionAst.Type != typename.Type)
{
if (filterToCall == null)
{
Expand All @@ -202,7 +202,7 @@ private static void AddMembersByInferredTypesClrType(TypeInferenceContext typeIn
if (!isStatic)
{
var consolidatedString = DotNetAdapter.GetInternedTypeNameHierarchy(type);
results.AddRange(typeInferenceContext.ExecutionContext.TypeTable.GetMembers<PSMemberInfo>(consolidatedString));
results.AddRange(ExecutionContext.TypeTable.GetMembers<PSMemberInfo>(consolidatedString));
}

var members = isStatic
Expand All @@ -212,13 +212,10 @@ private static void AddMembersByInferredTypesClrType(TypeInferenceContext typeIn
}
}




internal static void AddMembersByInferredTypeDefinitionAst(TypeInferenceContext typeInferenceContext, PSTypeName typename, bool isStatic,
internal void AddMembersByInferredTypeDefinitionAst(PSTypeName typename, bool isStatic,
Func<object, bool> filter, Func<object, bool> filterToCall, List<object> results)
{
if (typeInferenceContext.CurrentTypeDefinitionAst != typename.TypeDefinitionAst)
if (CurrentTypeDefinitionAst != typename.TypeDefinitionAst)
{
if (filterToCall == null)
filterToCall = o => !IsMemberHidden(o);
Expand Down Expand Up @@ -259,7 +256,7 @@ internal static void AddMembersByInferredTypeDefinitionAst(TypeInferenceContext
var baseTypeName = baseType.TypeName as TypeName;
if (baseTypeName == null) continue;
var baseTypeDefinitionAst = baseTypeName._typeDefinitionAst;
results.AddRange(GetMembersByInferredType(typeInferenceContext, new PSTypeName(baseTypeDefinitionAst), isStatic, filterToCall));
results.AddRange(GetMembersByInferredType(new PSTypeName(baseTypeDefinitionAst), isStatic, filterToCall));
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

class foo : Hashtable {}
In this case, baseType._typeDefinitionAst is null, and thus new PSTypeName(baseTypeDefinitionAst) will throw.

}

// Add stuff from our base class System.Object.
Expand Down Expand Up @@ -288,17 +285,17 @@ internal static void AddMembersByInferredTypeDefinitionAst(TypeInferenceContext
// Reset the filter because the recursive call will add IsHidden back if necessary.
filterToCall = filter;
}
results.AddRange(GetMembersByInferredType(typeInferenceContext, new PSTypeName(typeof(object)), isStatic, filterToCall));
results.AddRange(GetMembersByInferredType(new PSTypeName(typeof(object)), isStatic, filterToCall));
}


private static void AddMembersByInferredTypeCimType(TypeInferenceContext typeInferenceContext, PSTypeName typename, List<object> results, Func<object, bool> filterToCall)
internal void AddMembersByInferredTypeCimType(PSTypeName typename, List<object> results, Func<object, bool> filterToCall)
{
string cimNamespace;
string className;
if (ParseCimCommandsTypeName(typename, out cimNamespace, out className))
{
var powerShellExecutionHelper = typeInferenceContext.Helper;
var powerShellExecutionHelper = Helper;
powerShellExecutionHelper
.AddCommandWithPreferenceSetting("CimCmdlets\\Get-CimClass")
.AddParameter("Namespace", cimNamespace)
Expand Down Expand Up @@ -327,10 +324,7 @@ private static void AddMembersByInferredTypeCimType(TypeInferenceContext typeInf
internal IEnumerable<PSTypeName> InferType(Ast ast, TypeInferenceVisitor visitor)
{
var res = ast.Accept(visitor);
if (res == null)
{
return EmptyPSTypeNameArray;
}
Diagnostics.Assert(res != null, "Fix visit methods to not return null");
return (IEnumerable<PSTypeName>)res;
}

Expand Down Expand Up @@ -991,7 +985,7 @@ private IEnumerable<PSTypeName> InferTypesFrom(MemberExpressionAst memberExpress
var memberNameList = new List<string> { memberAsStringConst.Value };
foreach (var type in exprType)
{
var members = TypeInferenceContext.GetMembersByInferredType(_context, type, isStatic, filter: null);
var members = _context.GetMembersByInferredType(type, isStatic, filter: null);

for (int i = 0; i < memberNameList.Count; i++)
{
Expand Down
0