private ScriptFile[] GetBuiltinCommandScriptFiles( PSModuleInfo moduleInfo, Workspace workspace) { // if there is module info for this command if (moduleInfo != null) { string modPath = moduleInfo.Path; List <ScriptFile> scriptFiles = new List <ScriptFile>(); ScriptFile newFile; // find any files where the moduleInfo's path ends with ps1 or psm1 // and add it to allowed script files if (modPath.EndsWith(@".ps1") || modPath.EndsWith(@".psm1")) { newFile = workspace.GetFile(modPath); newFile.IsAnalysisEnabled = false; scriptFiles.Add(newFile); } if (moduleInfo.NestedModules.Count > 0) { foreach (PSModuleInfo nestedInfo in moduleInfo.NestedModules) { string nestedModPath = nestedInfo.Path; if (nestedModPath.EndsWith(@".ps1") || nestedModPath.EndsWith(@".psm1")) { newFile = workspace.GetFile(nestedModPath); newFile.IsAnalysisEnabled = false; scriptFiles.Add(newFile); } } } return(scriptFiles.ToArray()); } return(new List <ScriptFile>().ToArray()); }
private ScriptFile[] GetBuiltinCommandScriptFiles( PSModuleInfo moduleInfo, Workspace workspace) { // if there is module info for this command if (moduleInfo != null) { string modPath = moduleInfo.Path; List<ScriptFile> scriptFiles = new List<ScriptFile>(); ScriptFile newFile; // find any files where the moduleInfo's path ends with ps1 or psm1 // and add it to allowed script files if (modPath.EndsWith(@".ps1") || modPath.EndsWith(@".psm1")) { newFile = workspace.GetFile(modPath); newFile.IsAnalysisEnabled = false; scriptFiles.Add(newFile); } if (moduleInfo.NestedModules.Count > 0) { foreach (PSModuleInfo nestedInfo in moduleInfo.NestedModules) { string nestedModPath = nestedInfo.Path; if (nestedModPath.EndsWith(@".ps1") || nestedModPath.EndsWith(@".psm1")) { newFile = workspace.GetFile(nestedModPath); newFile.IsAnalysisEnabled = false; scriptFiles.Add(newFile); } } } return scriptFiles.ToArray(); } return new List<ScriptFile>().ToArray(); }
/// <summary> /// Finds all the references of a symbol /// </summary> /// <param name="foundSymbol">The symbol to find all references for</param> /// <param name="referencedFiles">An array of scriptFiles too search for references in</param> /// <param name="workspace">The workspace that will be searched for symbols</param> /// <returns>FindReferencesResult</returns> public async Task <FindReferencesResult> FindReferencesOfSymbol( SymbolReference foundSymbol, ScriptFile[] referencedFiles, Workspace workspace) { if (foundSymbol == null) { return(null); } int symbolOffset = referencedFiles[0].GetOffsetAtPosition( foundSymbol.ScriptRegion.StartLineNumber, foundSymbol.ScriptRegion.StartColumnNumber); // Make sure aliases have been loaded await GetAliases(); // We want to look for references first in referenced files, hence we use ordered dictionary // TODO: File system case-sensitivity is based on filesystem not OS, but OS is a much cheaper heuristic #if CoreCLR // The RuntimeInformation.IsOSPlatform is not supported in .NET Framework var fileMap = RuntimeInformation.IsOSPlatform(OSPlatform.Linux) ? new OrderedDictionary() : new OrderedDictionary(StringComparer.OrdinalIgnoreCase); #else var fileMap = new OrderedDictionary(StringComparer.OrdinalIgnoreCase); #endif foreach (ScriptFile file in referencedFiles) { fileMap.Add(file.FilePath, file); } foreach (string file in workspace.EnumeratePSFiles()) { if (!fileMap.Contains(file)) { ScriptFile scriptFile; try { scriptFile = workspace.GetFile(file); } catch (Exception e) when(e is IOException || e is SecurityException || e is FileNotFoundException || e is DirectoryNotFoundException || e is PathTooLongException || e is UnauthorizedAccessException) { // If we can't access the file for some reason, just ignore it continue; } fileMap.Add(file, scriptFile); } } var symbolReferences = new List <SymbolReference>(); foreach (object fileName in fileMap.Keys) { var file = (ScriptFile)fileMap[fileName]; IEnumerable <SymbolReference> references = AstOperations.FindReferencesOfSymbol( file.ScriptAst, foundSymbol, _cmdletToAliasDictionary, _aliasToCmdletDictionary); foreach (SymbolReference reference in references) { try { reference.SourceLine = file.GetLine(reference.ScriptRegion.StartLineNumber); } catch (ArgumentOutOfRangeException e) { reference.SourceLine = string.Empty; _logger.WriteException("Found reference is out of range in script file", e); } reference.FilePath = file.FilePath; symbolReferences.Add(reference); } } return(new FindReferencesResult { SymbolFileOffset = symbolOffset, SymbolName = foundSymbol.SymbolName, FoundReferences = symbolReferences }); }