public static IEnumerable <ScriptSymbol> GetImportedScripts(this ScriptSymbol symbol)
        {
#if FALLOUT4
            var importedScriptIdentifiers = symbol?.File.CompilerType.pImportedTypes.Keys;
#elif SKYRIM
            var importedScriptIdentifiers = symbol?.Definition.Definitions.OfType <ImportNode>().Select(n => ObjectIdentifier.Parse(n.Identifier.Text));
#endif

            return(importedScriptIdentifiers?.
                   Select(name => ObjectIdentifier.Parse(name)).
                   Where(name => name != symbol.Id).
                   Except(symbol.GetExtendedScriptChain().Select(extended => extended.Id)).
                   Select(name => symbol.File.Program.ScriptFiles[name].Symbol));
        }
        public static IEnumerable <ScriptSymbol> GetExtendedScriptChain(this ScriptSymbol symbol, bool includeSelf = false)
        {
            if (includeSelf)
            {
                yield return(symbol);
            }

            var extended = symbol?.ExtendedScript;

            while (extended != null)
            {
                yield return(extended);

                extended = extended.ExtendedScript;
            }
        }
        public static IEnumerable <PapyrusSymbol> GetScriptMemberSymbols(
            this ScriptSymbol symbol,
            bool declaredOnly            = false,
            bool includeDeclaredPrivates = false,
            bool globalOnly = false,
            SymbolKinds additionalNonGlobalKinds = SymbolKinds.None)
        {
            var symbols = (IEnumerable <PapyrusSymbol>)symbol.Definition.ScopedSymbols.Values;

            if (!globalOnly)
            {
                var kindFilter = SymbolKinds.Property | SymbolKinds.Function | SymbolKinds.Event | SymbolKinds.Struct | SymbolKinds.Group;
                if (includeDeclaredPrivates)
                {
                    kindFilter |= SymbolKinds.Variable;
                }

                kindFilter |= additionalNonGlobalKinds;

                symbols = symbols.Where(s => (s.Flags & LanguageFlags.Global) == 0 && (s.Kind & kindFilter) != 0);
            }
            else
            {
                symbols = symbols.Where(s => (s.Flags & LanguageFlags.Global) != 0 && (s.Kind & SymbolKinds.Function) != 0);

                if (declaredOnly)
                {
                    symbols = symbols.Where(s => s.Script == symbol.Script);
                }
            }

            if (!declaredOnly)
            {
                var extendedScript = symbol.ExtendedScript;
                if (extendedScript != null)
                {
                    symbols = symbols.Concat(extendedScript.GetScriptMemberSymbols(globalOnly: globalOnly));
                }
            }

            return(symbols.DistinctBy(s => s.Name + "_" + s.Kind, StringComparer.OrdinalIgnoreCase));
        }