Exemple #1
0
        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());
            }
        }
Exemple #2
0
        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])));
        }