本文整理汇总了C#中Lens.Compiler.Context.FindType方法的典型用法代码示例。如果您正苦于以下问题:C# Context.FindType方法的具体用法?C# Context.FindType怎么用?C# Context.FindType使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Lens.Compiler.Context
的用法示例。
在下文中一共展示了Context.FindType方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: Resolve
public override IEnumerable<PatternNameBinding> Resolve(Context ctx, Type expressionType)
{
var typeEntity = ctx.FindType(Identifier.FullSignature);
if(typeEntity == null || (!typeEntity.Kind.IsAnyOf(TypeEntityKind.Type, TypeEntityKind.TypeLabel)))
Error(Identifier, CompilerMessages.PatternNotValidType, Identifier.FullSignature);
Type = ctx.ResolveType(Identifier);
if (!Type.IsExtendablyAssignableFrom(expressionType) && !expressionType.IsExtendablyAssignableFrom(Type))
Error(CompilerMessages.PatternTypeMatchImpossible, Type, expressionType);
try
{
var field = typeEntity.ResolveField("Tag");
return LabelRule.Resolve(ctx, field.Type);
}
catch(KeyNotFoundException)
{
Error(CompilerMessages.PatternTypeNoTag, Identifier.FullSignature);
return NoBindings();
}
}
示例2: resolve
protected override Type resolve(Context ctx, bool mustReturn)
{
if(Identifier == "_")
error(CompilerMessages.UnderscoreNameUsed);
// local variable
var local = Local ?? ctx.Scope.FindLocal(Identifier);
if (local != null)
{
// only local constants are cached
// because mutable variables could be closured later on
if (local.IsConstant && local.IsImmutable && ctx.Options.UnrollConstants)
_LocalConstant = local;
return local.Type;
}
// static function declared in the script
try
{
var methods = ctx.MainType.ResolveMethodGroup(Identifier);
if (methods.Length > 1)
error(CompilerMessages.FunctionInvocationAmbiguous, Identifier);
_Method = methods[0];
return FunctionalHelper.CreateFuncType(_Method.ReturnType, _Method.GetArgumentTypes(ctx));
}
catch (KeyNotFoundException) { }
// algebraic type without a constructor
var type = ctx.FindType(Identifier);
if (type != null && type.Kind == TypeEntityKind.TypeLabel)
{
try
{
type.ResolveConstructor(new Type[0]);
_Type = type;
return _Type.TypeInfo;
}
catch (KeyNotFoundException) { }
}
// global property
try
{
_Property = ctx.ResolveGlobalProperty(Identifier);
return _Property.PropertyType;
}
catch (KeyNotFoundException)
{
error(CompilerMessages.IdentifierNotFound, Identifier);
}
return typeof (UnitType);
}
示例3: Resolve
public override IEnumerable<PatternNameBinding> Resolve(Context ctx, Type expressionType)
{
var typeEntity = ctx.FindType(Identifier.FullSignature);
if (typeEntity == null || (!typeEntity.Kind.IsAnyOf(TypeEntityKind.Record)))
Error(Identifier, CompilerMessages.PatternNotValidRecord, Identifier.FullSignature);
Type = ctx.ResolveType(Identifier);
if (!Type.IsExtendablyAssignableFrom(expressionType) && !expressionType.IsExtendablyAssignableFrom(Type))
Error(CompilerMessages.PatternTypeMatchImpossible, Type, expressionType);
var duplicate = FieldRules.GroupBy(x => x.Name).FirstOrDefault(x => x.Count() > 1);
if(duplicate != null)
Error(CompilerMessages.PatternRecordFieldDuplicated, duplicate.Key);
var subBindings = new List<PatternNameBinding>();
foreach (var fieldRule in FieldRules)
{
try
{
var field = typeEntity.ResolveField(fieldRule.Name.FullSignature);
subBindings.AddRange(fieldRule.Rule.Resolve(ctx, field.Type));
}
catch (KeyNotFoundException)
{
Error(fieldRule.Name, CompilerMessages.PatternRecordNoField, Identifier.FullSignature, fieldRule.Name.FullSignature);
}
}
return subBindings;
}