/// <summary> /// Register the compiler plugin. /// </summary> /// <param name="plugin"></param> public void Register(CompilerPlugin plugin) { _allPlugins.Add(plugin); if (plugin.PluginType == "expr" && plugin.StartTokens.Length > 0) { foreach (var startToken in plugin.StartTokens) { var tokenPlugins = _pluginExprs.ContainsKey(startToken) ? _pluginExprs[startToken] : new List<CompilerPlugin>(); tokenPlugins.Add(plugin); _pluginExprs[startToken] = tokenPlugins; } } else if(plugin.PluginType == "token" ) { var tplugin = new TokenReplacePlugin(); var hasStartTokens = plugin.StartTokens != null && plugin.StartTokens.Length > 0; var list = new List<CompilerPlugin>(); plugin.Handler = tplugin; list.Add(plugin); if( hasStartTokens ) { foreach(var startToken in plugin.StartTokens) { _pluginTokens[startToken] = list; } } if (plugin.TokenReplacements != null && plugin.TokenReplacements.Count > 0) { foreach (var replacements in plugin.TokenReplacements) { var alias = replacements[0]; var replaceWith = replacements[1]; tplugin.SetupReplacement(alias, replaceWith); if(!hasStartTokens) { _pluginTokens[alias] = list; } } } } }