private static ImmutableArray<IInteractiveWindowCommand> GetApplicableCommands(IInteractiveWindowCommand[] commands, string coreContentType, string specializedContentType) { // get all commands of coreContentType - generic interactive window commands var interactiveCommands = commands.Where( c => c.GetType().GetCustomAttributes(typeof(ContentTypeAttribute), inherit: true).Any( a => ((ContentTypeAttribute)a).ContentTypes == coreContentType)).ToArray(); // get all commands of specializedContentType - smart C#/VB command implementations var specializedInteractiveCommands = commands.Where( c => c.GetType().GetCustomAttributes(typeof(ContentTypeAttribute), inherit: true).Any( a => ((ContentTypeAttribute)a).ContentTypes == specializedContentType)).ToArray(); // We should choose specialized C#/VB commands over generic core interactive window commands // Build a map of names and associated core command first Dictionary<string, int> interactiveCommandMap = new Dictionary<string, int>(); for (int i = 0; i < interactiveCommands.Length; i++) { foreach (var name in interactiveCommands[i].Names) { interactiveCommandMap.Add(name, i); } } // swap core commands with specialized command if both exist // Command can have multiple names. We need to compare every name to find match. int value; foreach (var command in specializedInteractiveCommands) { foreach (var name in command.Names) { if (interactiveCommandMap.TryGetValue(name, out value)) { interactiveCommands[value] = command; break; } } } return interactiveCommands.ToImmutableArray(); }
private static ImmutableArray<IInteractiveWindowCommand> FilterCommands(IInteractiveWindowCommand[] commands, string contentType) { return commands.Where( c => c.GetType().GetCustomAttributes(typeof(ContentTypeAttribute), inherit: true).Any( a => ((ContentTypeAttribute)a).ContentTypes == contentType)).ToImmutableArray(); }