internal void AssociateDroppedSolutionItems(HashSet <string> paths) { if (paths.Count == 0) { return; } var existingUris = new HashSet <string>(SolutionArtifactLinkReference .GetReferenceValues(this.CurrentElement) .Select(u => u.ToString().ToLowerInvariant())); var items = this.Solution.Find(i => (i.Kind == ItemKind.Item || i.Kind == ItemKind.Project) && paths.Contains(i.PhysicalPath.ToLowerInvariant())); foreach (var item in items) { var uri = UriService.CreateUri(item); if (!existingUris.Contains(uri.ToString().ToLowerInvariant())) { // add new reference with tag ReferenceKindProvider <SolutionArtifactLinkReference, Uri> .AddReference(CurrentElement, uri).Tag = this.Tag ?? string.Empty; } else { // Update tag on reference (add if not already exist) var reference = ReferenceKindProvider <SolutionArtifactLinkReference, Uri> .GetReference(CurrentElement, uri); if (reference != null) { reference.AddTag(this.Tag); } } } }
public override void Execute() { try { this.ValidateObject(); tracer.Info( Resources.SynchArtifactNameCommand_TraceInitial, this.CurrentElement.InstanceName, this.ReferenceTag); if (!string.IsNullOrEmpty(this.ReferenceTag) && this.ReferenceTag != FilteredReferenceTagValue) { UpdateReferenceTagTo1113(); } foreach (var reference in this.CurrentElement.References) { if (reference.Kind == typeof(SolutionArtifactLinkReference).ToString()) { var referenceTag = GetReference(reference.Tag); if (referenceTag == null) { continue; } if (referenceTag.SyncNames || this.ReferenceTag == null) { var referenceUri = ReferenceKindProvider <SolutionArtifactLinkReference, Uri> .FromReference(reference); var solutionItem = this.UriReferenceService.TryResolveUri <IItemContainer>(referenceUri); if (solutionItem == null) { tracer.Warn( Resources.SynchArtifactNameCommand_TraceFailedToResolveReference, referenceUri, this.CurrentElement.InstanceName); continue; } var solutionItemName = Path.GetFileNameWithoutExtension(solutionItem.Name); if (!solutionItemName.Equals(this.CurrentElement.InstanceName, StringComparison.OrdinalIgnoreCase)) { var proposedItemName = string.Empty; if (string.IsNullOrEmpty(referenceTag.TargetFileName)) { // TODO: Determine if the 'InstanceName' property was the one changed, if not abort sync proposedItemName = this.CurrentElement.InstanceName; } else { // TODO: Determine whether any of the properties referenced in TargetFileName syntax // (i.e. {InstanceName} or {PropertyName}) was the property actually changed, and if not, dont sync! var resolver = new PathResolver(this.CurrentElement, this.UriReferenceService, @"\", string.IsNullOrEmpty(referenceTag.TargetFileName) ? this.CurrentElement.InstanceName : referenceTag.TargetFileName); resolver.Resolve(); proposedItemName = Path.GetFileNameWithoutExtension(resolver.FileName); } tracer.Info( Resources.SynchArtifactNameCommand_TraceRenameSolutionItem, solutionItem.Name, proposedItemName); var uiService = (IVsUIShell)this.ServiceProvider.GetService(typeof(IVsUIShell)); var newItemName = solutionItem.Rename(proposedItemName, true, uiService); tracer.Info( Resources.SynchArtifactNameCommand_TraceSolutionItemRenamed, solutionItem.Name, newItemName); } else { tracer.Info( Resources.SynchArtifactNameCommand_TraceItemIgnoredSameName, solutionItem.Name); } } } } } catch (Exception) { tracer.Error( Resources.SynchArtifactNameCommand_TraceFailedSync, this.CurrentElement.InstanceName); throw; } }