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); }
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); } } } }