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