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);
        }
예제 #2
0
        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);
        }
예제 #4
0
        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);
            }
예제 #7
0
        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);
        }
예제 #8
0
        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);
        }
예제 #9
0
        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);
        }
예제 #10
0
      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;
      }