Example #1
0
        public bool Resolve(TypeResolveContext trc, bool errors)
        {
            if (BaseClass.ResolveExtension("RTemplate", trc, errors))
            {
                return(true);
            }

            bool?ret = BaseClass.ResolvesAsRule(trc, errors);

            if (ret == null)
            {
                return(true);
            }

            if ((bool)ret)
            {
                // We derive from a Rule. Our Template's base class
                // should be the default TargetTemplate. The rule's
                // BaseClass is our BaseClass.
                rb.BaseClass = BaseClass;
                return(false);
            }

            UserType rule = BaseClass.ResolveBoundRuleType(trc, errors);

            if (rule == null)
            {
                Console.Error.WriteLine("Rule baseclass {0} of {1} is not either a rule " +
                                        "or a rule-bound template", BaseClass, this);
                return(true);
            }

            rb.BaseClass   = rule;
            tmpl.BaseClass = BaseClass;
            return(false);
        }
Example #2
0
        public override bool Resolve(TypeResolveContext trc, bool errors)
        {
            bool ret = base.Resolve(trc, errors);

            ret |= MatchType.ResolveExtension("RTemplate", trc, errors);

            // RegexMatcher will handle distinguishing between when
            // we return a Rule type and a TargetTemplate type, but we need
            // to check if we require a binding.

            bool?foo = MatchType.ResolvesAsRule(trc, errors);

            if (foo == null)
            {
                // MatchType unresolved, can't say.
                return(true);
            }

            if ((bool)foo)
            {
                // We point to a Rule, and ResolveUsedStructureType will
                // complain if we call it on MatchType.

                if (UsesStructure)
                {
                    throw ExHelp.App("Odd, MatcherBuilder {0} is using its structure" +
                                     "even though it points to a plain rule {1}", this,
                                     MatchType);
                }

                return(false);
            }

            // We have a template, so see if it uses a structure

            UserType stype = MatchType.ResolveUsedStructureType(trc, errors);

            if (errors)
            {
                if (stype == null && UsesStructure)
                {
                    // XXX is this actually an error? Shouldn't happen, I think.
                    Console.Error.WriteLine("Matcher {0} is bound to structure {1} but its " +
                                            "associated template {2} is unbound", this,
                                            Params, MatchType);
                    return(true);
                }
                else if (stype != null && !UsesStructure)
                {
                    UseStructure();
                }
                else if (stype != null && !NS.ParamsType.Equals(stype))
                {
                    // FIXME: see if Structure has a member of type stype.
                    Console.Error.WriteLine("Matcher {0} is bound to the structure {1}  but its " +
                                            "associated template {2} is bound to {3}", this,
                                            Params, MatchType, stype);
                    return(true);
                }
            }

            return(ret);
        }