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);
        }