public void Finish(RepoProject repoProject)
        {
            foreach (var entry in ReferenceDefinitionMap)
            {
                var def     = entry.Value;
                var project = ReferencedProjects.GetOrAdd(def.ProjectId, id => new ReferencedProject()
                {
                    ProjectId   = id,
                    DisplayName = id,
                });

                project.Definitions.Add(def);
            }

            foreach (var referencedProject in ReferencedProjects.Values.OrderBy(rp => rp.ProjectId, StringComparer.OrdinalIgnoreCase))
            {
                if (referencedProject.ProjectId != Project.Id)
                {
                    Project.ReferencedProjects.Add(referencedProject);
                }

                // Remove all the namespaces
                referencedProject.Definitions.RemoveAll(ds => ds.Kind == nameof(SymbolKind.Namespace));

                // Sort the definitions by qualified name
                referencedProject.Definitions.Sort((d1, d2) => d1.DisplayName.CompareTo(d2.DisplayName));
            }

            //CreateNamespaceFile();
            CreateReferencedProjectFiles(repoProject);
        }
        public override async Task Analyze(RepoProject project)
        {
            var assembly = assemblyFileByMetadataAsSourceProjectPath[project.ProjectDirectory];

            try
            {
                var solution = await MetadataAsSource.LoadMetadataAsSourceSolution(assembly, project.ProjectDirectory);

                if (solution == null)
                {
                    return;
                }

                var proj = solution.Projects.Single();

                var projectInfo = ProjectInfo.Create(proj.Id, VersionStamp.Create(), project.ProjectId, project.ProjectId, LanguageNames.CSharp,
                                                     documents: proj.Documents.Select(d => DocumentInfo.Create(d.Id, d.Name, filePath: d.FilePath, folders: d.Folders)));

                SolutionProjectAnalyzer.AddSolutionProject(
                    new Lazy <Task <Microsoft.CodeAnalysis.Solution> >(() => Task.FromResult(solution)),
                    projectInfo,
                    project.ProjectFile,
                    project,
                    csharpSemanticServices: new Lazy <SemanticServices>(() => new SemanticServices(solution.Workspace, LanguageNames.CSharp)));

                if (project.Analyzer != this)
                {
                    await project.Analyzer.Analyze(project);
                }
            }
            catch
            {
            }
        }
Example #3
0
        public override async void Analyze(RepoProject project)
        {
            var logger = project.Repo.AnalysisServices.Logger;

            try
            {
                var services = project.Repo.AnalysisServices;
                logger.LogMessage("Loading project: " + project.ProjectId);

                using (services.TaskDispatcher.TrackScope())
                {
                    await services.TaskDispatcher.Invoke(async() =>
                    {
                        var solution = await lazySolution.Value;
                        Project      = solution.GetProject(ProjectId);
                        if (Project == null)
                        {
                            logger.LogError($"Can't find project for {ProjectId} in {solution}");
                        }
                        else
                        {
                            Compilation         = await Project.GetCompilationAsync();
                            CompilationServices = new CompilationServices(Compilation);

                            foreach (var reference in Compilation.ReferencedAssemblyNames)
                            {
                                var referencedProject = new ReferencedProject()
                                {
                                    ProjectId   = reference.Name,
                                    DisplayName = reference.GetDisplayName(),
                                    Properties  = new Dictionary <string, string>()
                                    {
                                        { "PublicKey", string.Concat(reference.PublicKey.Select(b => b.ToString("X2"))) }
                                    }
                                };

                                ProjectContext.ReferencedProjects.TryAdd(referencedProject.ProjectId, referencedProject);
                            }
                        }

                        base.Analyze(project);
                    });

                    var documents = await Task.WhenAll(DocumentAnalysisTasks);

                    ProjectContext.Finish(project);

                    UploadProject(project, ProjectContext.Project);

                    project.Analyzer = RepoProjectAnalyzer.Null;
                }
            }
            catch (Exception ex)
            {
                logger.LogExceptionError($"Loading project {project.ProjectId}", ex);
            }
        }
Example #4
0
        public override void Initialize(Repo repo)
        {
            base.Initialize(repo);

            if (AddImports)
            {
                repo.AnalysisServices.TaskDispatcher.QueueInvoke(async() =>
                {
                    MSBuildSharedRepo    = await repo.AnalysisServices.CreateRepo(MSBuildSharedRepoName);
                    MSBuildSharedProject = MSBuildSharedRepo.CreateRepoProject(MSBuildProjectId, @"\\msbuild\");
                });
            }
        }
        private void CreateReferencedProjectFiles(RepoProject repoProject)
        {
            foreach (var project in ReferencedProjects.Values)
            {
                if (project.Definitions.Count == 0)
                {
                    continue;
                }

                CreateMetadataFile(repoProject, GetProjectReferenceSymbolsPath(project.ProjectId), () =>
                {
                    XElement container = null;
                    return(Element("ReferenceSymbols")
                           .AddAttribute("Count", project.Definitions.Count)
                           .ForEach(project.Definitions, (el, definition) =>
                    {
                        var nsdata = definition.ExtData as NamespaceExtensionData;
                        container = nsdata?.GetNamespaceElement(el) ?? el;

                        if (definition.DisplayName.StartsWith(nsdata?.Qualifier ?? string.Empty))
                        {
                            ReferenceSymbol reference = definition;
                            reference.ReferenceKind = nameof(ReferenceKind.ProjectLevelReference);
                            reference.ExcludeFromSearch = true;
                            container.AddElement("Symbol", symbolElement =>
                                                 symbolElement
                                                 .AddAttribute("Name", definition.DisplayName
                                                               .Substring(nsdata?.Qualifier.Length ?? 0), reference)
                                                 .AddAttribute("ReferenceCount", definition.ReferenceCount.ToString()));
                        }
                    }));
                });
            }

            CreateMetadataFile(repoProject, "ReferenceProjects.xml", () =>
            {
                return(Element("ReferenceProjects").ForEach(ReferencedProjects.Values
                                                            .OrderBy(rp => rp.ProjectId, StringComparer.OrdinalIgnoreCase)
                                                            .ThenBy(rp => rp.DisplayName, StringComparer.OrdinalIgnoreCase), (el, project) =>
                {
                    ReferenceSymbol fileRef = project.Definitions.Count == 0 ? null : CreateFileReferenceSymbol(
                        GetMetadataFilePath(GetProjectReferenceSymbolsPath(project.ProjectId)),
                        Project.Id);
                    el.AddElement("Project", projElement =>
                                  projElement
                                  .AddAttribute("ReferenceCount", project.Definitions.Count.ToString(), fileRef)
                                  .AddAttribute("Name", project.ProjectId)
                                  .AddAttribute("FullName", project.DisplayName));
                }));
            });
        }
        public static void AddSolutionProject(
            Lazy <Task <Solution> > lazySolution,
            ProjectInfo projectInfo,
            RepoFile projectFile,
            RepoProject repoProject,
            Lazy <SemanticServices> csharpSemanticServices      = null,
            Lazy <SemanticServices> visualBasicSemanticServices = null)
        {
            var semanticServices = projectInfo.Language == LanguageNames.CSharp ?
                                   csharpSemanticServices :
                                   visualBasicSemanticServices;

            Contract.Assert(semanticServices.Value != null);

            var projectAnalyzer = new ManagedProjectAnalyzer(
                semanticServices.Value,
                repoProject,
                projectInfo.Id,
                lazySolution);

            if (projectFile != null)
            {
                projectFile.HasExplicitAnalyzer = true;
            }

            repoProject.Analyzer = projectAnalyzer;

            foreach (var document in projectInfo.Documents)
            {
                if (document == null)
                {
                    throw new ArgumentNullException($"Project {projectInfo.Id} has a null document.");
                }

                if (Path.GetFileName(document.FilePath).StartsWith("TemporaryGeneratedFile_", StringComparison.OrdinalIgnoreCase))
                {
                    continue;
                }

                var file = AddDocumentToProject(repoProject, document);
                if (file != null && projectAnalyzer != null)
                {
                    file.Analyzer = projectAnalyzer.CreateFileAnalyzer(document);
                }
            }

            foreach (var document in projectInfo.AdditionalDocuments)
            {
                AddDocumentToProject(repoProject, document);
            }
        }
        public virtual void Analyze(RepoProject project)
        {
            project.Repo.AnalysisServices.Logger.WriteLine($"Analyzing project {project.ProjectId}");

            foreach (var file in project.Files)
            {
                if (file.PrimaryProject == project)
                {
                    file.Analyze();
                }
            }

            UploadProject(project);
        }
Example #8
0
        public ManagedProjectAnalyzer(
            SemanticServices semanticServices,
            RepoProject repoProject,
            ProjectId projectId,
            Lazy <Task <Solution> > lazySolution)
        {
            this.semanticServices = semanticServices;
            ProjectId             = projectId;
            this.lazySolution     = lazySolution;

            var analyzedProject = new AnalyzedProject(repoProject.Repo.Name, repoProject.ProjectId);

            ProjectContext = new AnalyzedProjectContext(analyzedProject);
        }
Example #9
0
        public override void Initialize(Repo repo)
        {
            var dd = new Dictionary <string, RepoProject>();

            foreach (var semanticDataDirectory in semanticDataDirectories)
            {
                var store = new CodexSemanticStore(semanticDataDirectory);
                store.Load();

                foreach (var project in store.Projects.List)
                {
                    var repoProject = new RepoProject(project.Name, repo)
                    {
                        ProjectDirectory = project.Directory,
                        // $TODO;
                        //ProjectFile = projectFile
                    };

                    dd.Add(project.Name, repoProject);

                    repo.Projects.Add(repoProject);
                }

                foreach (var file in store.Files.List)
                {
                    if (!m_fileToStoreMap.ContainsKey(file.Path))
                    {
                        RepoFile repoFile;
                        if (!repo.FilesByPath.TryGetValue(file.Path, out repoFile))
                        {
                            RepoProject project;
                            if (!dd.TryGetValue(store.Projects[file.Project].Name, out project))
                            {
                                project = repo.DefaultRepoProject;
                            }

                            repoFile = project.AddFile(file.Path);
                        }

                        m_fileToStoreMap[repoFile.RepoRelativePath] = file;
                    }
                }
            }
        }
        private void CreateMetadataFile(RepoProject project, string fileName, Func <XElement> elementFactory)
        {
            var metadataFileBuilder = elementFactory().CreateAnnotatedSourceBuilder(
                new SourceFileInfo()
            {
                Path     = GetMetadataFilePath(fileName),
                Language = "xml",
            }, Project.Id);

            var repoFile = project.AddFile(
                $@"\\Codex\ProjectMetadata\{project.ProjectId}\{metadataFileBuilder.SourceFile.Info.Path}",
                metadataFileBuilder.SourceFile.Info.Path);

            repoFile.InMemorySourceFileBuilder = metadataFileBuilder;

            metadataFileBuilder.BoundSourceFile.ExcludeFromSearch = true;

            repoFile.Analyze();
        }
        private static RepoFile AddDocumentToProject(RepoProject project, DocumentInfo document)
        {
            if (document.FilePath == null)
            {
                return(null);
            }

            string logicalPath = null;

            if (!project.InProjectDirectory(document.FilePath))
            {
                logicalPath = GetLogicalPath(document);
                if (logicalPath.Contains(":"))
                {
                    logicalPath = null;
                }
            }

            return(project.AddFile(document.FilePath, logicalPath));
        }
 protected static void UploadProject(RepoProject project, AnalyzedProject analyzedProject)
 {
     analyzedProject.ProjectKind = project.ProjectKind;
     project.Repo.AnalysisServices.TaskDispatcher.QueueInvoke(() =>
                                                              project.Repo.AnalysisServices.AnalysisTarget.AddProjectAsync(project, analyzedProject), TaskType.Upload);
 }
        public virtual void UploadProject(RepoProject project)
        {
            AnalyzedProject analyzedProject = new AnalyzedProject(project.Repo.Name, project.ProjectId);

            UploadProject(project, analyzedProject);
        }
 public override void Analyze(RepoProject project)
 {
 }
 public override void UploadProject(RepoProject project)
 {
 }
 public override void Analyze(RepoProject project)
 {
     base.Analyze(project);
 }