internal ProjectServiceExtension GetExtensionChain (IBuildTarget target)
{
ProjectServiceExtension chain;
if (target != null) {
ExtensionChainInfo einfo = (ExtensionChainInfo) Thread.GetData (extensionChainSlot);
if (einfo == null) {
einfo = new ExtensionChainInfo ();
ExtensionContext ctx = AddinManager.CreateExtensionContext ();
einfo.ExtensionContext = ctx;
einfo.ItemTypeCondition = new ItemTypeCondition (target.GetType ());
einfo.ProjectLanguageCondition = new ProjectLanguageCondition (target);
ctx.RegisterCondition ("ItemType", einfo.ItemTypeCondition);
ctx.RegisterCondition ("ProjectLanguage", einfo.ProjectLanguageCondition);
Thread.SetData (extensionChainSlot, einfo);
} else {
einfo.ItemTypeCondition.ObjType = target.GetType ();
einfo.ProjectLanguageCondition.TargetProject = target;
}
ProjectServiceExtension[] extensions = einfo.ExtensionContext.GetExtensionObjects ("/MonoDevelop/ProjectModel/ProjectServiceExtensions", typeof(ProjectServiceExtension)).Cast<ProjectServiceExtension> ().ToArray ();
chain = CreateExtensionChain (extensions);
// After creating the chain there is no need to keep the reference to the target
einfo.ProjectLanguageCondition.TargetProject = null;
}
else {
if (defaultExtensionChain == null) {
ExtensionContext ctx = AddinManager.CreateExtensionContext ();
ctx.RegisterCondition ("ItemType", new ItemTypeCondition (typeof(UnknownItem)));
ctx.RegisterCondition ("ProjectLanguage", new ProjectLanguageCondition (UnknownItem.Instance));
ProjectServiceExtension[] extensions = ctx.GetExtensionObjects ("/MonoDevelop/ProjectModel/ProjectServiceExtensions", typeof(ProjectServiceExtension)).Cast<ProjectServiceExtension> ().ToArray ();
defaultExtensionChain = CreateExtensionChain (extensions);
}
chain = defaultExtensionChain;
target = UnknownItem.Instance;
}
if (chain.SupportsItem (target))
return chain;
else
return chain.GetNext (target);
}