Exemplo n.º 1
0
        protected override bool Init(GenerationEnvironment env)
        {
            env.errorContext.ClearFlag();

            if (!(base.Init(env)))
            {
                return(false);
            }

            symbol.TryGetAttribute(RelevantSymbols.AutoActivationAttribute, out var autoActivation);
            var exportedChains = GetExportedChains(env);

            if (autoActivation is null)
            {
                Chains = exportedChains.ToArray();

                if (Chains.Length == 0)
                {
                    env.ReportError("Behaviors must define at least a chain. Otherwise, they are just components");
                }
            }
            else
            {
                if (exportedChains.Any())
                {
                    env.ReportError($"Behaviors decorated with AutoActivation cannot define additional chains.");
                }
                else
                {
                    if (!TryInitActivationContext(env, out var context))
                    {
                        return(false);
                    }

                    Chains = new IChainWrapper[] {
                        new BehaviorActivationChainWrapper("Check", symbol, context),
                        new BehaviorActivationChainWrapper("Do", symbol, context)
                    };

                    foreach (var chain in Chains)
                    {
                        env.TryAddChain(chain);
                    }

                    ActivationAlias = autoActivation.Alias;

                    if (env.aliases.Contains(ActivationAlias))
                    {
                        env.ReportError($"Duplicate alias name {ActivationAlias} in behavior {symbol.Name}.");
                    }
                }
            }

            return(!env.errorContext.Flag);
        }
Exemplo n.º 2
0
 private IEnumerable <ChainSymbolWrapper> GetExportedChains(GenerationEnvironment env)
 {
     foreach (var field in symbol.GetInstanceFields())
     {
         if (field.TryGetAttribute(RelevantSymbols.ChainAttribute, out var chainAttribute))
         {
             var wrapped = new ChainSymbolWrapper(field, chainAttribute);
             if (wrapped.Init(env) && env.TryAddChain(wrapped))
             {
                 yield return(wrapped);
             }
         }
     }
 }