/// <summary> /// Creates type wrapper for a generic, such as List[str] /// </summary> /// <returns></returns> public override IAnalysisSet GetIndex(Node node, AnalysisUnit unit, IAnalysisSet index) { if (node is IndexExpression ie) { return(unit.InterpreterScope.GetOrMakeNodeValue(node, NodeValueKind.TypeAnnotation, n => { // Use annotation converter and reparse the index var exprs = new List <Expression>(); if (ie.Index is SequenceExpression te) { exprs.AddRange(te.Items.MaybeEnumerate()); } else { exprs.Add(ie.Index); } var newArgs = new List <IAnalysisSet>(); var eval = new ExpressionEvaluatorAnnotationConverter( new ExpressionEvaluator(unit), node, unit, returnInternalTypes: true ); foreach (var type in exprs.Select(e => new TypeAnnotation(unit.State.LanguageVersion, e))) { newArgs.Add(type.GetValue(eval) ?? AnalysisSet.Empty); } return new TypingTypeInfo(_typeName, _innerValue, newArgs); })); } return(this); }
public override IAnalysisSet Call(Node node, AnalysisUnit unit, IAnalysisSet[] args, NameExpression[] keywordArgNames) { if ((_typeArgs == null || !_typeArgs.Any()) && node is CallExpression ce) { return(unit.InterpreterScope.GetOrMakeNodeValue(node, NodeValueKind.TypeAnnotation, n => { // Use annotation converter and reparse the arguments var newArgs = new List <IAnalysisSet>(); var eval = new ExpressionEvaluatorAnnotationConverter( new ExpressionEvaluator(unit), node, unit, returnInternalTypes: true ); foreach (var type in ce.Args.MaybeEnumerate().Where(e => e?.Expression != null).Select(e => new TypeAnnotation(unit.State.LanguageVersion, e.Expression))) { newArgs.Add(type.GetValue(eval) ?? AnalysisSet.Empty); } return new TypingTypeInfo(_typeName, _innerValue, newArgs); })); } return(this); }