Ejemplo n.º 1
0
    public ModifierGroupEffectSymbol(
        ISymbol containingSymbol,
        ModifierGroupNode declaration,
        DiagnosticBag diagnostics)
        : base(containingSymbol)
    {
        Declaration = declaration;
        // BS_SPEC: modifier group creates a scope: all modifiers (and sub groups)
        // have their own conditions combined via AND with all conditions and condition groups
        // declared at that modifier's level. We achieve the same via IConditionalEffectSymbol:
        // any nested effects (sub modifiers and sub modifier groups) only execute if top condition
        // is satisfied, emulating the AND behavior.
        if (declaration.Repeats.Count > 0)
        {
            // TODO implement repeats
            // TODO consider what happens when there are both repeats and conditions
            // create a loop effect
            diagnostics.Add(ErrorCode.ERR_SyntaxSupportNotYetImplemented, declaration.Repeats);
        }
        Condition        = new ModifierRootConditionSymbol(this, declaration, diagnostics);
        SatisfiedEffects = CreateChildEffects().ToImmutableArray();

        IEnumerable <IEffectSymbol> CreateChildEffects()
        {
            foreach (var item in declaration.Modifiers)
            {
                yield return(CreateEffect(this, item, diagnostics));
            }
            foreach (var item in declaration.ModifierGroups)
            {
                yield return(CreateEffect(this, item, diagnostics));
            }
        }
    }
Ejemplo n.º 2
0
    public ModifierEffectSymbol(
        ISymbol containingSymbol,
        ModifierNode declaration,
        DiagnosticBag diagnostics)
        : base(containingSymbol)
    {
        Declaration = declaration;
        if (declaration.Repeats.Count > 0)
        {
            // TODO implement repeats
            // TODO consider what happens when there are both repeats and conditions
            // create a loop effect
            diagnostics.Add(ErrorCode.ERR_SyntaxSupportNotYetImplemented, declaration.Repeats);
        }
        Condition = new ModifierRootConditionSymbol(this, declaration, diagnostics);
        var satisfiedEffect = new ModifyingEffectSymbol(this, declaration);

        SatisfiedEffects = ImmutableArray.Create <IEffectSymbol>(satisfiedEffect);
    }