本文整理汇总了C#中PreservationMode类的典型用法代码示例。如果您正苦于以下问题:C# PreservationMode类的具体用法?C# PreservationMode怎么用?C# PreservationMode使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
PreservationMode类属于命名空间,在下文中一共展示了PreservationMode类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: CreateLazyFullyParsedTree
private static ValueSource<TreeAndVersion> CreateLazyFullyParsedTree(
ValueSource<TextAndVersion> newTextSource,
string filePath,
ParseOptions options,
HostLanguageServices languageServices,
PreservationMode mode = PreservationMode.PreserveValue)
{
return new AsyncLazy<TreeAndVersion>(
c => FullyParseTreeAsync(newTextSource, filePath, options, languageServices, mode, c),
cacheResult: true);
}
示例2: WithTextDocumentText
public static Solution WithTextDocumentText(this Solution solution, DocumentId documentId, SourceText text, PreservationMode mode = PreservationMode.PreserveIdentity)
{
var document = solution.GetTextDocument(documentId);
if (document is Document)
{
return solution.WithDocumentText(documentId, text, mode);
}
else
{
return solution.WithAdditionalDocumentText(documentId, text, mode);
}
}
示例3: WithAdditionalDocumentTextLoader
/// <summary>
/// Creates a new solution instance with the additional document specified updated to have the text
/// supplied by the text loader.
/// </summary>
public Solution WithAdditionalDocumentTextLoader(DocumentId documentId, TextLoader loader, PreservationMode mode)
{
var newState = _state.WithAdditionalDocumentTextLoader(documentId, loader, mode);
if (newState == _state)
{
return this;
}
return new Solution(newState);
}
示例4: WithAdditionalDocumentTextLoader
/// <summary>
/// Creates a new solution instance with the additional document specified updated to have the text
/// supplied by the text loader.
/// </summary>
public SolutionState WithAdditionalDocumentTextLoader(DocumentId documentId, TextLoader loader, PreservationMode mode)
{
CheckContainsAdditionalDocument(documentId);
var oldDocument = this.GetAdditionalDocumentState(documentId);
// assumes that text has changed. user could have closed a doc without saving and we are loading text from closed file with
// old content. also this should make sure we don't re-use latest doc version with data associated with opened document.
return this.WithTextDocumentState(oldDocument.UpdateText(loader, mode), textChanged: true, recalculateDependentVersions: true);
}
示例5: WithAdditionalDocumentText
/// <summary>
/// Creates a new solution instance with the additional document specified updated to have the text
/// and version specified.
/// </summary>
public SolutionState WithAdditionalDocumentText(DocumentId documentId, TextAndVersion textAndVersion, PreservationMode mode = PreservationMode.PreserveValue)
{
if (documentId == null)
{
throw new ArgumentNullException(nameof(documentId));
}
if (textAndVersion == null)
{
throw new ArgumentNullException(nameof(textAndVersion));
}
CheckContainsAdditionalDocument(documentId);
var oldDocument = this.GetAdditionalDocumentState(documentId);
return WithTextDocumentState(oldDocument.UpdateText(textAndVersion, mode), textChanged: true);
}
示例6: WithDocumentText
/// <summary>
/// Creates a new solution instance with the document specified updated to have the text
/// specified.
/// </summary>
public SolutionState WithDocumentText(DocumentId documentId, SourceText text, PreservationMode mode = PreservationMode.PreserveValue)
{
if (documentId == null)
{
throw new ArgumentNullException(nameof(documentId));
}
if (text == null)
{
throw new ArgumentNullException(nameof(text));
}
CheckContainsDocument(documentId);
var oldDocument = this.GetDocumentState(documentId);
SourceText oldText;
if (oldDocument.TryGetText(out oldText) && text == oldText)
{
return this;
}
// check to see if this solution has already been branched before with the same doc & text changes.
// this helps reduce duplicate parsing when typing, and separate services generating duplicate symbols.
if (mode == PreservationMode.PreserveIdentity)
{
var branch = _firstBranch;
if (branch != null && branch.Id == documentId && branch.Text == text)
{
return branch.Solution;
}
}
var newSolution = this.WithDocumentState(oldDocument.UpdateText(text, mode), textChanged: true);
if (mode == PreservationMode.PreserveIdentity && _firstBranch == null)
{
Interlocked.CompareExchange(ref _firstBranch, new SolutionBranch(documentId, text, newSolution), null);
}
return newSolution;
}
示例7: AddDocument
/// <summary>
/// Creates a new solution instance with the corresponding project updated to include a new
/// document instance defined by its name and root <see cref="SyntaxNode"/>.
/// </summary>
public Solution AddDocument(DocumentId documentId, string name, SyntaxNode syntaxRoot, IEnumerable<string> folders = null, string filePath = null, bool isGenerated = false, PreservationMode preservationMode = PreservationMode.PreserveValue)
{
return AddDocument(documentId, name, SourceText.From(string.Empty), folders, filePath, isGenerated).WithDocumentSyntaxRoot(documentId, syntaxRoot, preservationMode);
}
示例8: UpdateText
public TextDocumentState UpdateText(SourceText newText, PreservationMode mode)
{
if (newText == null)
{
throw new ArgumentNullException(nameof(newText));
}
var newVersion = this.GetNewerVersion();
var newTextAndVersion = TextAndVersion.Create(newText, newVersion, this.FilePath);
var newState = this.UpdateText(newTextAndVersion, mode);
return newState;
}
示例9: CreateRecoverableTextAndTree
// use static method so we don't capture references to this
private static Tuple<ValueSource<TextAndVersion>, TreeAndVersion> CreateRecoverableTextAndTree(
SyntaxNode newRoot, VersionStamp textVersion, VersionStamp treeVersion, Encoding encoding,
DocumentInfo info, ParseOptions options, ISyntaxTreeFactoryService factory, PreservationMode mode, SolutionServices solutionServices)
{
string filePath = info.FilePath;
SyntaxTree tree = null;
ValueSource<TextAndVersion> lazyTextAndVersion = null;
if ((mode == PreservationMode.PreserveIdentity) || !factory.CanCreateRecoverableTree(newRoot))
{
// its okay to use a strong cached AsyncLazy here because the compiler layer SyntaxTree will also keep the text alive once its built.
lazyTextAndVersion = new TreeTextSource(
new AsyncLazy<SourceText>(
c => tree.GetTextAsync(c),
c => tree.GetText(c),
cacheResult: true),
textVersion,
filePath);
tree = factory.CreateSyntaxTree(GetSyntaxTreeFilePath(info), options, encoding, newRoot);
}
else
{
// uses CachedWeakValueSource so the document and tree will return the same SourceText instance across multiple accesses as long
// as the text is referenced elsewhere.
lazyTextAndVersion = new TreeTextSource(
new CachedWeakValueSource<SourceText>(
new AsyncLazy<SourceText>(
c => BuildRecoverableTreeTextAsync(tree, encoding, c),
c => BuildRecoverableTreeText(tree, encoding, c),
cacheResult: false)),
textVersion,
filePath);
tree = factory.CreateRecoverableTree(info.Id.ProjectId, GetSyntaxTreeFilePath(info), options, lazyTextAndVersion, encoding, newRoot);
}
return Tuple.Create(lazyTextAndVersion, TreeAndVersion.Create(tree, treeVersion));
}
示例10: UpdateTree
internal DocumentState UpdateTree(SyntaxNode newRoot, PreservationMode mode)
{
if (newRoot == null)
{
throw new ArgumentNullException(nameof(newRoot));
}
var newTextVersion = this.GetNewerVersion();
var newTreeVersion = GetNewTreeVersionForUpdatedTree(newRoot, newTextVersion, mode);
// determine encoding
Encoding encoding;
SyntaxTree priorTree;
SourceText priorText;
if (this.TryGetSyntaxTree(out priorTree))
{
// this is most likely available since UpdateTree is normally called after modifying the existing tree.
encoding = priorTree.Encoding;
}
else if (this.TryGetText(out priorText))
{
encoding = priorText.Encoding;
}
else
{
// the existing encoding was never observed so is unknown.
encoding = null;
}
var syntaxTreeFactory = _languageServices.GetService<ISyntaxTreeFactoryService>();
var result = CreateRecoverableTextAndTree(newRoot, newTextVersion, newTreeVersion, encoding, this.info, _options, syntaxTreeFactory, mode, this.solutionServices);
return new DocumentState(
this.LanguageServices,
this.solutionServices,
this.info,
_options,
sourceTextOpt: null,
textSource: result.Item1,
treeSource: new ConstantValueSource<TreeAndVersion>(result.Item2));
}
示例11: UpdateText
internal DocumentState UpdateText(TextLoader loader, SourceText textOpt, PreservationMode mode)
{
if (loader == null)
{
throw new ArgumentNullException(nameof(loader));
}
var newTextSource = mode == PreservationMode.PreserveIdentity
? CreateStrongText(loader, this.Id, this.solutionServices, reportInvalidDataException: true)
: CreateRecoverableText(loader, this.Id, this.solutionServices, reportInvalidDataException: true);
// Only create the ValueSource for creating the SyntaxTree if this is a Document that
// supports SyntaxTrees. There's no point in creating the async lazy and holding onto
// this data otherwise.
var newTreeSource = !this.SupportsSyntaxTree
? ValueSource<TreeAndVersion>.Empty
: CreateLazyFullyParsedTree(
newTextSource,
this.Id.ProjectId,
GetSyntaxTreeFilePath(this.info),
_options,
_languageServices,
this.solutionServices,
mode);
return new DocumentState(
this.LanguageServices,
this.solutionServices,
this.info,
_options,
sourceTextOpt: textOpt,
textSource: newTextSource,
treeSource: newTreeSource);
}
示例12: UpdateText
public TextDocumentState UpdateText(TextLoader loader, PreservationMode mode)
{
if (loader == null)
{
throw new ArgumentNullException("loader");
}
var newTextSource = (mode == PreservationMode.PreserveIdentity)
? CreateStrongText(loader, this.Id, this.solutionServices)
: CreateRecoverableText(loader, this.Id, this.solutionServices);
return new TextDocumentState(
this.solutionServices,
this.info,
textSource: newTextSource);
}
示例13: WithDocumentText
/// <summary>
/// Creates a new solution instance with all the documents specified updated to have the same specified text.
/// </summary>
public Solution WithDocumentText(IEnumerable<DocumentId> documentIds, SourceText text, PreservationMode mode = PreservationMode.PreserveValue)
{
var newState = _state.WithDocumentText(documentIds, text, mode);
if (newState == _state)
{
return this;
}
return new Solution(newState);
}
示例14: GetNewTreeVersionForUpdatedTree
private VersionStamp GetNewTreeVersionForUpdatedTree(SyntaxNode newRoot, VersionStamp newTextVersion, PreservationMode mode)
{
if (mode != PreservationMode.PreserveIdentity)
{
return newTextVersion;
}
TreeAndVersion oldTreeAndVersion;
SyntaxNode oldRoot;
if (!this.treeSource.TryGetValue(out oldTreeAndVersion) || !oldTreeAndVersion.Tree.TryGetRoot(out oldRoot))
{
return newTextVersion;
}
return oldRoot.IsEquivalentTo(newRoot, topLevel: true) ? oldTreeAndVersion.Version : newTextVersion;
}
示例15: CreateRecoverableTextAndTree
// use static method so we don't capture references to this
private static Tuple<AsyncLazy<TextAndVersion>, AsyncLazy<TreeAndVersion>> CreateRecoverableTextAndTree(
SyntaxNode newRoot, VersionStamp textVersion, VersionStamp treeVersion,
DocumentInfo info, ParseOptions options, ISyntaxTreeFactoryService factory, PreservationMode mode)
{
string filePath = info.FilePath;
Encoding encoding = info.DefaultEncoding;
AsyncLazy<TreeAndVersion> lazyTree = null;
// this captures the lazyTree local
var lazyText = new AsyncLazy<TextAndVersion>(
c => GetTextAndVersionAsync(lazyTree, textVersion, encoding, filePath, c),
c => GetTextAndVersion(lazyTree, textVersion, encoding, filePath, c),
cacheResult: false);
// this should be only called when we do forking, since there is no cheap way to figure out what has been changed,
// we will always consider top level being changed by giving new version here.
if (mode == PreservationMode.PreserveIdentity)
{
lazyTree = new AsyncLazy<TreeAndVersion>(
TreeAndVersion.Create(factory.CreateSyntaxTree(GetSyntaxTreeFilePath(info), options, newRoot, encoding), treeVersion));
}
else
{
lazyTree = new AsyncLazy<TreeAndVersion>(
TreeAndVersion.Create(factory.CreateRecoverableTree(GetSyntaxTreeFilePath(info), options, lazyText, newRoot, reparse: false), treeVersion));
}
return Tuple.Create(lazyText, lazyTree);
}