示例#1
0
        public static ModulePackage GetOrCreatePackageByDirectory(string physicalPackagePath, bool create = false)
        {
            RootPackage root = null;

            foreach (var kv in ParsedDirectories)
            {
                if (!physicalPackagePath.StartsWith(kv.Key))
                {
                    continue;
                }

                root = kv.Value;
                physicalPackagePath = physicalPackagePath.Substring(kv.Key.Length);
                break;
            }

            if (root == null)
            {
                return(null);
            }

            physicalPackagePath = physicalPackagePath.Trim(Path.DirectorySeparatorChar);

            if (physicalPackagePath == string.Empty)
            {
                return(root);
            }

            return(root.GetOrCreateSubPackage(physicalPackagePath.Replace(Path.DirectorySeparatorChar, '.'), create));
        }
示例#2
0
        /// <summary>
        /// Use this method to add a syntax tree to the parse cache.
        /// Equally-named trees will be overwritten.
        /// </summary>
        public void AddOrUpdate(IAbstractSyntaxTree ast)
        {
            if (ast == null)
            {
                return;
            }

            var packName = ModuleNameHelper.ExtractPackageName(ast.ModuleName);

            if (string.IsNullOrEmpty(packName))
            {
                Root.Modules[ast.ModuleName] = ast;

                if (ast.ModuleName == "object")
                {
                    HandleObjectModule(ast);
                }
                return;
            }

            var pack = Root.GetOrCreateSubPackage(packName, true);

            pack.Modules[ModuleNameHelper.ExtractModuleName(ast.ModuleName)] = ast;
        }
        void PrepareQueue(RootPackage root)
        {
            if (!Directory.Exists(baseDirectory))
            {
                return;
            }

            //ISSUE: wild card character ? seems to behave differently across platforms
            // msdn: -> Exactly zero or one character.
            // monodocs: -> Exactly one character.
            var dFiles  = Directory.GetFiles(baseDirectory, "*.d", SearchOption.AllDirectories);
            var diFiles = Directory.GetFiles(baseDirectory, "*.di", SearchOption.AllDirectories);
            var files   = new string[dFiles.Length + diFiles.Length];

            Array.Copy(dFiles, 0, files, 0, dFiles.Length);
            Array.Copy(diFiles, 0, files, dFiles.Length, diFiles.Length);

            var lastPack = (ModulePackage)root;
            var lastDir  = baseDirectory;

            bool isPhobosRoot = this.baseDirectory.EndsWith(Path.DirectorySeparatorChar + "phobos");

            foreach (var file in files)
            {
                var modulePath = DModule.GetModuleName(baseDirectory, file);

                if (lastDir != (lastDir = Path.GetDirectoryName(file)))
                {
                    isPhobosRoot = this.baseDirectory.EndsWith(Path.DirectorySeparatorChar + "phobos");

                    var packName = ModuleNameHelper.ExtractPackageName(modulePath);
                    lastPack = root.GetOrCreateSubPackage(packName, true);
                }

                // Skip index.d (D2) || phobos.d (D2|D1)
                if (isPhobosRoot && (file.EndsWith("index.d") || file.EndsWith("phobos.d")))
                {
                    continue;
                }

                queue.Push(new KeyValuePair <string, ModulePackage>(file, lastPack));
            }
        }
        void PrepareQueue(RootPackage root)
        {
            if (!Directory.Exists(baseDirectory))
                return;

            //ISSUE: wild card character ? seems to behave differently across platforms
            // msdn: -> Exactly zero or one character.
            // monodocs: -> Exactly one character.
            var dFiles = Directory.GetFiles(baseDirectory, "*.d", SearchOption.AllDirectories);
            var diFiles = Directory.GetFiles(baseDirectory, "*.di", SearchOption.AllDirectories);
            var files = new string[dFiles.Length + diFiles.Length];
            Array.Copy(dFiles, 0, files, 0, dFiles.Length);
            Array.Copy(diFiles, 0, files, dFiles.Length, diFiles.Length);

            var lastPack = (ModulePackage)root;
            var lastDir = baseDirectory;

            bool isPhobosRoot = this.baseDirectory.EndsWith(Path.DirectorySeparatorChar + "phobos");

            foreach (var file in files)
            {
                var modulePath = DModule.GetModuleName(baseDirectory, file);

                if (lastDir != (lastDir = Path.GetDirectoryName(file)))
                {
                    isPhobosRoot = this.baseDirectory.EndsWith(Path.DirectorySeparatorChar + "phobos");

                    var packName = ModuleNameHelper.ExtractPackageName(modulePath);
                    lastPack = root.GetOrCreateSubPackage(packName, true);
                }

                // Skip index.d (D2) || phobos.d (D2|D1)
                if (isPhobosRoot && (file.EndsWith("index.d") || file.EndsWith("phobos.d")))
                    continue;

                queue.Push(new KeyValuePair<string, ModulePackage>(file, lastPack));
            }
        }