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