void TrySetResult(ParseResult parseResult) { // Der Puffer wurde zwischenzeitlich schon wieder geändert. Dieses Ergebnis brauchen wir nicht, // da bereits ein neues berechnet wird. if (TextBuffer.CurrentSnapshot != parseResult.Snapshot) { if (!WaitingForAnalysis) { // Dieser Fall sollte eigentlich nicht eintreten, denn es muss bereits eine neue Berechnung angetriggert worden sein Invalidate(); } return; } _parseResult = parseResult; var snapshotSpan = parseResult.Snapshot.ToSnapshotSpan(); OnParseResultChanged(new SnapshotSpanEventArgs(snapshotSpan)); }
static async Task<SemanticModelResult> BuildResultAsync(ParseResult parseResult, CancellationToken cancellationToken) { return await Task.Run(() => { if(parseResult == null) { return null; } var syntaxTree = parseResult.SyntaxTree; var snapshot = parseResult.Snapshot; var compilationUnitSyntax = syntaxTree.GetRoot() as CompilationUnitSyntax; if(compilationUnitSyntax == null) { return null; } var compilationUnit = CompilationUnit.FromCompilationUnitSyntax(compilationUnitSyntax, cancellationToken); return new SemanticModelResult(compilationUnit, snapshot); }, cancellationToken).ConfigureAwait(false); }
static async Task<SemanticModelResult> BuildResultAsync(ParseResult parseResult, CancellationToken cancellationToken) { return await Task.Run(() => { using(Logger.LogBlock(nameof(BuildResultAsync))) { if(parseResult == null) { Logger.Debug("Es gibt kein ParesResult. Der Vorgang wird abgebrochen."); return null; } var syntaxTree = parseResult.SyntaxTree; var snapshot = parseResult.Snapshot; var codeGenerationUnitSyntax = syntaxTree.GetRoot() as CodeGenerationUnitSyntax; if(codeGenerationUnitSyntax == null) { Logger.Debug($"Der SyntaxRoot ist nicht vom Typ {typeof(CodeGenerationUnitSyntax)}. Der Vorgang wird abgebrochen."); return null; } var codeGenerationUnit = CodeGenerationUnit.FromCodeGenerationUnitSyntax(codeGenerationUnitSyntax, cancellationToken); return new SemanticModelResult(codeGenerationUnit, snapshot); } }, cancellationToken).ConfigureAwait(false); }