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()); } }
public override IEnumerable <PatternNameBinding> Resolve(Context ctx, Type expressionType) { if (!expressionType.IsAppliedVersionOf(typeof(KeyValuePair <,>))) { Error(CompilerMessages.PatternTypeMismatch, expressionType, typeof(KeyValuePair <,>)); } _types = expressionType.GetGenericArguments(); return(KeyRule.Resolve(ctx, _types[0]) .Concat(ValueRule.Resolve(ctx, _types[1]))); }