private void ResolveParentFolders(FrontendCompiler context, List <FileSystemResource> resolves) { Folder defaultRootFolder = this.GetDefaultRoot(context); foreach (FileSystemResource r in new List <FileSystemResource>(resolves)) { if (!String.IsNullOrEmpty(r.ParentFolderIdFromName)) { PackageItem item; Folder newParentFolder = null; if (context.TryGetItemById(r.ParentFolderIdFromName, out item)) { newParentFolder = item as Folder; if (newParentFolder == null) { context.OnMessage(new CompilerMessageEventArgs(CompilerMessage.InvalidFolderReference(r.ParentFolderIdFromName, item.GetType().Name), r.LineNumber)); } } else // did not find a matching id. { // TODO: come up with a better error message for this. context.OnMessage(new CompilerMessageEventArgs(CompilerMessage.InvalidFolderReference(r.ParentFolderIdFromName, "not found"), r.LineNumber)); } if (newParentFolder != null) { // If this is a "no name" folder then reparent all the contents to this new parent if (r is Folder && String.IsNullOrEmpty(r.Name)) { this.ReparentFolderChildren(context, (Folder)r, newParentFolder); resolves.Remove(r); // folder is deleted, be sure not to try to continue to process it. } else // simply point our folder to this new parent. { r.ReparentFolder(newParentFolder); } } } else if (r.ParentFolder == null && !(r is Folder && ((Folder)r).External)) // if we didn't get a parent folder yet and this is not an external folder reference, default to the application folder. { r.ReparentFolder(defaultRootFolder); } } }
private PackageItem SetTarget(FrontendCompiler context, PackageItem item) { if (this.targetProperty.GetValue(this.targetItem, null) != null) { context.OnMessage(new CompilerMessageEventArgs(CompilerMessage.OverwritingImplicitProperty(this.targetProperty.Name, this.Lookup), this.targetItem)); } this.targetProperty.SetValue(this.targetItem, item, null); return(item); }
/// <summary> /// Resolves the lookup but may not fail if missing. /// </summary> /// <param name="context">Frontend compiler containing all the objects that may satisfy the resolution.</param> /// <param name="allowUnresolved">Flag specifying whether to allow unresolved items to be returned.</param> /// <returns>Item resolved.</returns> public PackageItem Resolve(FrontendCompiler context, bool allowUnresolved) { if (this.ResolvedItem == null) { string targetPropertyName = this.targetProperty == null ? String.Empty : this.targetProperty.Name; CompilerMessage message = null; PackageItem item = null; if (context.TryGetItemById(this.Lookup, out item)) { if (this.targetType.IsInstanceOfType(item)) { if (this.targetProperty != null) { this.SetTarget(context, item); } } else if (!allowUnresolved) { message = CompilerMessage.InvalidIdResolution( targetPropertyName, this.Lookup, this.targetType.Name, item.GetType().Name); } } else if (this.targetType.IsSubclassOf(typeof(FileSystemResource)) || this.targetType == typeof(IFileReference)) { Resource resource; FileSystemResourceManager manager = (FileSystemResourceManager)context.GetService(typeof(FileSystemResourceManager)); if (manager.TryFindResourceByPath(context, this.Lookup, out resource)) { if (this.targetType.IsInstanceOfType(resource)) { if (this.targetProperty != null) { item = this.SetTarget(context, resource); } else { item = resource; } } else { message = CompilerMessage.InvalidIdResolution( targetPropertyName, this.Lookup, this.targetType.Name, resource.GetType().Name); } } else if (!allowUnresolved) { message = CompilerMessage.UnknownFileSystemResolution( targetPropertyName, this.Lookup, this.targetType.Name); } } else if (!allowUnresolved) { message = CompilerMessage.UnknownIdResolution( targetPropertyName, this.Lookup, this.targetType.Name); } if (message != null) { context.OnMessage(new CompilerMessageEventArgs(message, this.targetItem)); } this.ResolvedItem = item; } return(this.ResolvedItem); }