private Set ReadSet() { int lineCount = Convert.ToInt32(xr.GetAttribute("lineCount")); Set set = new Set(lineCount); if (xr.ReadToDescendant("block")) { do { string sourceFile = xr.GetAttribute("sourceFile"); int startLineNumber = Convert.ToInt32(xr.GetAttribute("startLineNumber")); int endLineNumber = Convert.ToInt32(xr.GetAttribute("endLineNumber")); IList <IProjectItem> projectFiles = solution.FindProjectItemsByLocation(new FileSystemPath(sourceFile)).ToArray(); if (projectFiles.Count > 1) { throw new ApplicationException("Expected exactly one file corresponding to " + sourceFile); } IProjectFile projectFile = (IProjectFile)projectFiles[0]; DocumentRange?range = GetDocumentRange2(sourceFile, projectFile, startLineNumber, endLineNumber); set.AddBlock(sourceFile, startLineNumber, endLineNumber, projectFile, range); } while (xr.ReadToNextSibling("block")); } return(set); }
public static IPsiSourceFile FindSourceFileInSolution([CanBeNull] this FileSystemPath includePath, [CanBeNull] ISolution solution) { if (includePath == null || includePath.IsEmpty) { return(null); } return(solution ?.FindProjectItemsByLocation(includePath) .OfType <IProjectFile>() .FirstOrDefault()?.ToSourceFile()); }
public static ITypeElement GetTypeElementFromScriptAssetGuid(ISolution solution, [CanBeNull] string assetGuid) { if (assetGuid == null) { return(null); } var cache = solution.GetComponent <MetaFileGuidCache>(); var assetPaths = cache.GetAssetFilePathsFromGuid(assetGuid); if (assetPaths == null || assetPaths.IsEmpty()) { return(null); } // TODO: Multiple candidates! // I.e. someone has copy/pasted a .meta file if (assetPaths.Count != 1) { return(null); } var projectItems = solution.FindProjectItemsByLocation(assetPaths[0]); var assetFile = projectItems.FirstOrDefault() as IProjectFile; var expectedClassName = assetPaths[0].NameWithoutExtension; var psiSourceFiles = assetFile?.ToSourceFiles(); if (psiSourceFiles == null) { return(null); } var psiServices = solution.GetPsiServices(); foreach (var sourceFile in psiSourceFiles) { var elements = psiServices.Symbols.GetTypesAndNamespacesInFile(sourceFile); foreach (var element in elements) { // Note that theoretically, there could be multiple classes with the same name in different // namespaces. Unity's own behaviour here is undefined - it arbitrarily chooses one // TODO: Multiple candidates in a file if (element is ITypeElement typeElement && typeElement.ShortName == expectedClassName) { return(typeElement); } } } return(null); }
internal static IPsiSourceFile FindSourceFileInSolution([CanBeNull] this FileSystemPath includePath, [CanBeNull] ISolution solution) { if (includePath == null || includePath.IsEmpty || solution == null) { return(null); } IProjectFile includeProjectfile = solution .FindProjectItemsByLocation(includePath) .OfType <IProjectFile>() .FirstOrDefault(); return(includeProjectfile != null?includeProjectfile.ToSourceFile() : null); }
public bool CanHandle(FileSystemPath projectFileLocation) { using (ReadLockCookie.Create()) { foreach (var projectItem in mySolution.FindProjectItemsByLocation(projectFileLocation)) { var projectFile = projectItem as IProjectFile; if (projectFile?.GetProject()?.ProjectProperties.BuildSettings is CSharpBuildSettings) { return(true); } } return(false); } }
private static IProjectFile GrtSolutionFile(ISolution solution, File nitraSymbolFile) { var projectItems = solution.FindProjectItemsByLocation(FileSystemPath.Parse(nitraSymbolFile.FullName)); foreach (var projectItem in projectItems) { var symbolProjectFile = projectItem as IProjectFile; if (symbolProjectFile != null) { return(symbolProjectFile); } } return(null); }
public static IList <ITypeElement> GetTypeElementCandidatesFromScriptAssetGuid( ISolution solution, [CanBeNull] string assetGuid) { if (assetGuid == null) { return(EmptyList <ITypeElement> .Instance); } var cache = solution.GetComponent <MetaFileGuidCache>(); var assetPaths = cache.GetAssetFilePathsFromGuid(assetGuid); if (assetPaths == null || assetPaths.IsEmpty()) { return(EmptyList <ITypeElement> .Instance); } // Ideally, there should be only one file, with only one type which matches the filename. But someone could // have copy/pasted a .meta file, or have multiple elements in a file. If there are multiple, Unity will // arbitrarily pick one. var candidates = new List <ITypeElement>(); foreach (var assetPath in assetPaths) { var projectItems = solution.FindProjectItemsByLocation(assetPath); var assetFile = projectItems.FirstOrDefault() as IProjectFile; var psiSourceFiles = assetFile?.ToSourceFiles(); if (psiSourceFiles == null) { continue; } var psiServices = solution.GetPsiServices(); foreach (var sourceFile in psiSourceFiles) { var elements = psiServices.Symbols.GetTypesAndNamespacesInFile(sourceFile); foreach (var element in elements) { // We can't use nested types at all if (element is ITypeElement typeElement && typeElement.GetContainingType() == null && !typeElement.HasTypeParameters()) { candidates.Add(typeElement); } } } } return(candidates); }
private IProjectFile FindFile(Feature feature) { ICollection <IProjectItem> proj = _solution.FindProjectItemsByLocation(new FileSystemPath(feature.Source)); string featureFileName = Path.GetFileName(feature.Source.ToLower()); foreach (var item in proj) { var project = item.GetProject(); var file = project.GetAllProjectFiles().SingleOrDefault(_ => Path.GetFileName(_.Location.FullPath.ToLower()) == featureFileName); if (file != null) { return(file); } } return(null); }
private IProjectFile FindFile(Feature feature) { var proj = new List <IProjectItem>(); ReadLockCookie.Execute(() => proj.AddRange(_solution.FindProjectItemsByLocation(new FileSystemPath(feature.Source)))); string featureFileName = Path.GetFileName(feature.Source.ToLower()); foreach (var item in proj) { IProjectFile file = null; ReadLockCookie.Execute(() => { var project = item.GetProject(); file = project.GetAllProjectFiles().SingleOrDefault(_ => Path.GetFileName(_.Location.FullPath.ToLower()) == featureFileName); }); if (file != null) { return(file); } } return(null); }
private static IProjectFile GrtSolutionFile(ISolution solution, File nitraSymbolFile) { var projectItems = solution.FindProjectItemsByLocation(FileSystemPath.Parse(nitraSymbolFile.FullName)); foreach (var projectItem in projectItems) { var symbolProjectFile = projectItem as IProjectFile; if (symbolProjectFile != null) return symbolProjectFile; } return null; }