private static IEnumerable<CsDocument> LoadProject(
            IEnumerable<string> files, string sourceDirectory, string libwinrtdirs, out FullyQualifiedNamesCache fullyQualifiedNamesCache)
        {
            if (string.IsNullOrEmpty(sourceDirectory))
            {
                throw new ArgumentException("sourceDirectory");
            }

            if (string.IsNullOrEmpty(libwinrtdirs))
            {
                throw new ArgumentException("libwinrtdirs");
            }

            fullyQualifiedNamesCache = new FullyQualifiedNamesCache();

            // fullyQualifiedNamesCache.LoadNamesFrom(@"C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0\ExtensionSDKs\Microsoft.VCLibs\11.0\References\CommonConfiguration\neutral\platform.winmd");
            // fullyQualifiedNamesCache.LoadNamesFrom(@"C:\Program Files (x86)\Windows Kits\8.0\References\CommonConfiguration\Neutral\Windows.winmd");
            // todo: create unit test, resolving type of Interop::ElementType should be correct in both cases (if you load platform.winmd or windows.winmd first)
            foreach (var libwinrtdir in libwinrtdirs.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries))
            {
                foreach (var winmdFilePath in Directory.GetFiles(libwinrtdir, "*.winmd", SearchOption.AllDirectories))
                {
                    fullyQualifiedNamesCache.LoadNamesFrom(winmdFilePath);
                }
            }

            var project = CreateProject(sourceDirectory);

            // include all .h with "ref class"
            foreach (var path in Directory.GetFiles(sourceDirectory, "*.h", SearchOption.AllDirectories))
            {
                var csharpDocument = ParseHeaderFile(path, project);
                if (csharpDocument != null)
                {
                    fullyQualifiedNamesCache.LoadNamesFrom(csharpDocument);
                }
            }

            var documents = new List<CsDocument>();

            // load files which need to be converted
            // get abs file path for each file
            var absFilePathes = new List<string>();
            absFilePathes.AddRange(files.Select(f => Path.GetFullPath(Path.Combine(sourceDirectory, f))));

            foreach (var localCsDocument in absFilePathes
                                            .Select(path => ParseCsFile(path, project))
                                            .Where(localCsDocument => localCsDocument != null))
            {
                fullyQualifiedNamesCache.LoadNamesFrom(localCsDocument);
                documents.Add(localCsDocument);
            }

            // load All others Cs files
            foreach (var localCsDocument in Directory.GetFiles(sourceDirectory, "*.cs", SearchOption.AllDirectories)
                                            .Where(path => !absFilePathes.Contains(path))
                                            .Select(path => ParseCsFile(path, project))
                                            .Where(localCsDocument => localCsDocument != null))
            {
                fullyQualifiedNamesCache.LoadNamesFrom(localCsDocument);
            }

            return documents;
        }
 /// <summary>
 /// Initializes a new instance of the <see cref="ClassContext"/> class.
 /// </summary>
 /// <param name="class">
 /// The class.
 /// </param>
 /// <param name="fullyQualifiedNameCache">
 /// The fully qualified name cache.
 /// </param>
 public ClassContext(ClassBase @class, FullyQualifiedNamesCache fullyQualifiedNameCache)
 {
     this.@class = @class;
     this.namespaceNode = fullyQualifiedNameCache.FindNamespaceNodeFromRoot(this.Class.FullyQualifiedName);
     //Debug.Assert(this.namespaceNode != null);
 }
 private static IEnumerable<SharpToCppInterpreter> GetCsharpInterpretersFromFiles(
     IEnumerable<CsDocument> csharpDocuments,
     string sourceDirectory,
     string outputDirectory,
     FullyQualifiedNamesCache fullyQualifiedNamesCache)
 {
     return from csharpDocument in csharpDocuments
            let actualOutputDirectory = AdjustOutputDirectory(csharpDocument.SourceCode.Path, sourceDirectory, outputDirectory)
            let interpreter =
                new SharpToCppInterpreter(csharpDocument)
                    {
                        OutputDestinationFolder = actualOutputDirectory,
                        FullyQualifiedNames = fullyQualifiedNamesCache
                    }
            select interpreter;
 }