113 lines
3.6 KiB
C#
113 lines
3.6 KiB
C#
// Copyright (c) .NET Foundation. All rights reserved.
|
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
|
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Threading.Tasks;
|
|
using Microsoft.AspNetCore.Razor.Language;
|
|
|
|
namespace Microsoft.CodeAnalysis.Razor.ProjectSystem
|
|
{
|
|
internal class DefaultProjectSnapshot : ProjectSnapshot
|
|
{
|
|
private readonly object _lock;
|
|
|
|
private Dictionary<string, DefaultDocumentSnapshot> _documents;
|
|
|
|
public DefaultProjectSnapshot(ProjectState state)
|
|
{
|
|
if (state == null)
|
|
{
|
|
throw new ArgumentNullException(nameof(state));
|
|
}
|
|
|
|
State = state;
|
|
|
|
_lock = new object();
|
|
_documents = new Dictionary<string, DefaultDocumentSnapshot>(FilePathComparer.Instance);
|
|
}
|
|
|
|
public ProjectState State { get; }
|
|
|
|
public override RazorConfiguration Configuration => HostProject.Configuration;
|
|
|
|
public override IEnumerable<string> DocumentFilePaths => State.Documents.Keys;
|
|
|
|
public override string FilePath => State.HostProject.FilePath;
|
|
|
|
public HostProject HostProject => State.HostProject;
|
|
|
|
public override bool IsInitialized => WorkspaceProject != null;
|
|
|
|
public override VersionStamp Version => State.Version;
|
|
|
|
public override Project WorkspaceProject => State.WorkspaceProject;
|
|
|
|
public override DocumentSnapshot GetDocument(string filePath)
|
|
{
|
|
lock (_lock)
|
|
{
|
|
if (!_documents.TryGetValue(filePath, out var result) &&
|
|
State.Documents.TryGetValue(filePath, out var state))
|
|
{
|
|
result = new DefaultDocumentSnapshot(this, state);
|
|
_documents.Add(filePath, result);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
}
|
|
|
|
public override bool IsImportDocument(DocumentSnapshot document)
|
|
{
|
|
if (document == null)
|
|
{
|
|
throw new ArgumentNullException(nameof(document));
|
|
}
|
|
|
|
return State.ImportsToRelatedDocuments.ContainsKey(document.TargetPath);
|
|
}
|
|
|
|
public override IEnumerable<DocumentSnapshot> GetRelatedDocuments(DocumentSnapshot document)
|
|
{
|
|
if (document == null)
|
|
{
|
|
throw new ArgumentNullException(nameof(document));
|
|
}
|
|
|
|
if (State.ImportsToRelatedDocuments.TryGetValue(document.TargetPath, out var relatedDocuments))
|
|
{
|
|
lock (_lock)
|
|
{
|
|
return relatedDocuments.Select(GetDocument).ToArray();
|
|
}
|
|
}
|
|
|
|
return Array.Empty<DocumentSnapshot>();
|
|
}
|
|
|
|
public override RazorProjectEngine GetProjectEngine()
|
|
{
|
|
return State.ProjectEngine.GetProjectEngine(this.State);
|
|
}
|
|
|
|
public override Task<IReadOnlyList<TagHelperDescriptor>> GetTagHelpersAsync()
|
|
{
|
|
// IMPORTANT: Don't put more code here. We want this to return a cached task.
|
|
return State.TagHelpers.GetTagHelperInitializationTask(this);
|
|
}
|
|
|
|
public override bool TryGetTagHelpers(out IReadOnlyList<TagHelperDescriptor> result)
|
|
{
|
|
if (State.TagHelpers.IsResultAvailable)
|
|
{
|
|
result = State.TagHelpers.GetTagHelperInitializationTask(this).Result;
|
|
return true;
|
|
}
|
|
|
|
result = null;
|
|
return false;
|
|
}
|
|
}
|
|
} |