Error while saving file, hangs on 'Saving <filename>: Running 'AL Language' Formatter'
Describe the bug When I make changes to a file, sometimes the AL formatter errors 'a request has failed' and hangs while saving the file. I don't have steps to reproduce this, but in my experience it happens a lot when moving 'var' clauses between codeunits or in codeunits.
Saving the file, pressing 'cancel' on the formatter and closing and opening the file allows the user to format the document again.
Beneath is the output of the error.
[Error - 9:36:37 AM] Please report this issue to https://github.com/microsoft/al/issues including information on how to reproduce it, if possible.
Processing of message 'textDocument/formatting' failed with error: 'Unexpected false'
Details:
System.InvalidOperationException: Unexpected false
at Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces.Utilities.Contract.Fail(String message) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces\Utilities\Contract.cs:line 114
at Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces.StringExtensions.GetColumnFromLineOffset(String line, Int32 endPosition, Int32 tabSize) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces\Shared\Extensions\StringExtensions.cs:line 161
at Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces.TextLineExtensions.GetColumnFromLineOffset(TextLine line, Int32 lineOffset, Int32 tabSize) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces\Shared\Extensions\TextLineExtensions.cs:line 62
at Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces.Formatting.TreeData.NodeAndText.GetOriginalColumn(Int32 tabSize, SyntaxToken token) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces\Formatting\Engine\TreeData.NodeAndText.cs:line 31
at Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces.Formatting.FormattingExtensions.ProcessTextBetweenTokens(String text, TreeData treeInfo, SyntaxToken baseToken, Int32 tabSize, Int32& lineBreaks, Int32& spaceOrIndentation) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces\Formatting\Utilities\FormattingExtensions.cs:line 145
at Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces.Formatting.TriviaDataFactory.ComplexTrivia.ExtractLineAndSpace(String text, Int32& lines, Int32& spaces) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces\Formatting\Engine\Trivia\TriviaDataFactory.ComplexTrivia.cs:line 49
at Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces.Formatting.AbstractTriviaDataFactory.AbstractComplexTrivia..ctor(OptionSet optionSet, TreeData treeInfo, SyntaxToken token1, SyntaxToken token2) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces\Formatting\Engine\AbstractTriviaDataFactory.AbstractComplexTrivia.cs:line 22
at Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces.Formatting.TriviaDataFactory.Create(SyntaxToken token1, SyntaxToken token2) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces\Formatting\Engine\Trivia\TriviaDataFactory.cs:line 83
at Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces.Formatting.TokenStream.GetOriginalTriviaData(Int32 pairIndex) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces\Formatting\Engine\TokenStream.cs:line 465
at Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces.Formatting.TokenStream.GetOriginalTriviaData(TokenData token1, TokenData token2) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces\Formatting\Engine\TokenStream.cs:line 457
at Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces.Formatting.TokenStream.GetColumn(TokenData tokenData, Func`3 triviaDataGetter) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces\Formatting\Engine\TokenStream.cs:line 412
at Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces.Formatting.FormattingContext.AddAnchorIndentationOperation(AnchorIndentationOperation operation) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces\Formatting\Context\FormattingContext.cs:line 316
at Microsoft.Dynamics.Nav.CodeAnalysis.Utilities.EnumerableExtensions.Do[T](IEnumerable`1 source, Action`1 action) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Utilities\EnumerableExtensions.cs:line 58
at Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces.Formatting.TaskExecutor.SynchronousExecutor.ContinueWith[T1,T2](Task`1 previousTask, Func`2 nextAction, CancellationToken cancellationToken) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces\Formatting\Utilities\TaskExecutor.cs:line 88
at Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces.Formatting.AbstractFormatEngine.FormatAsync(CancellationToken cancellationToken) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces\Formatting\Engine\AbstractFormatEngine.cs:line 111
at Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces.LanguageServices.SyntaxFormattingService.FormatIndividuallyAsync(SyntaxNode node, OptionSet options, IEnumerable`1 rules, IList`1 spansToFormat, CancellationToken cancellationToken) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces\LanguageServices\SyntaxFormattingService.cs:line 148
at Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces.LanguageServices.SyntaxFormattingService.FormatAsync(SyntaxNode node, IEnumerable`1 spans, OptionSet options, IEnumerable`1 rules, CancellationToken cancellationToken) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces\LanguageServices\SyntaxFormattingService.cs:line 93
at Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces.Formatting.Formatter.FormatAsync(SyntaxNode node, IEnumerable`1 spans, Workspace workspace, OptionSet options, IEnumerable`1 rules, CancellationToken cancellationToken) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces\Formatting\Formatter.cs:line 295
at Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces.Formatting.Formatter.FormatAsync(Document document, IEnumerable`1 spans, OptionSet options, IEnumerable`1 rules, CancellationToken cancellationToken) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces\Formatting\Formatter.cs:line 227
at Microsoft.Dynamics.Nav.EditorServices.Protocol.Utility.FormattingHelper.FormatDocument(Document document, CancellationToken cancellationToken) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.EditorServices.Protocol\Utility\FormattingHelper.cs:line 23
at Microsoft.Dynamics.Nav.EditorServices.Protocol.LanguageServer.FormatDocumentRequestHandler.HandleAsync(DocumentFormattingParams request, Int32 requestId, CancellationToken cancellationToken) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.EditorServices.Protocol\LanguageServer\FormatDocumentRequestHandler.cs:line 35
at Microsoft.Dynamics.Nav.EditorServices.Protocol.MessageProtocol.RequestHandlerBase`1.HandleAsync(JToken requestContents, Int32 requestId, CancellationToken cancellationToken) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.EditorServices.Protocol\MessageProtocol\RequestHandlerBase.cs:line 65
at Microsoft.Dynamics.Nav.EditorServices.Protocol.RequestRegistry.Process(Message message) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.EditorServices.Protocol\Endpoints\RequestRegistry.cs:line 80
[Error - 9:37:14 AM] Please report this issue to https://github.com/microsoft/al/issues including information on how to reproduce it, if possible.
Processing of message 'textDocument/formatting' failed with error: 'Unexpected false'
Details:
System.InvalidOperationException: Unexpected false
at Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces.Utilities.Contract.Fail(String message) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces\Utilities\Contract.cs:line 114
at Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces.StringExtensions.GetColumnFromLineOffset(String line, Int32 endPosition, Int32 tabSize) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces\Shared\Extensions\StringExtensions.cs:line 161
at Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces.TextLineExtensions.GetColumnFromLineOffset(TextLine line, Int32 lineOffset, Int32 tabSize) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces\Shared\Extensions\TextLineExtensions.cs:line 62
at Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces.Formatting.TreeData.NodeAndText.GetOriginalColumn(Int32 tabSize, SyntaxToken token) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces\Formatting\Engine\TreeData.NodeAndText.cs:line 31
at Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces.Formatting.FormattingExtensions.ProcessTextBetweenTokens(String text, TreeData treeInfo, SyntaxToken baseToken, Int32 tabSize, Int32& lineBreaks, Int32& spaceOrIndentation) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces\Formatting\Utilities\FormattingExtensions.cs:line 145
at Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces.Formatting.TriviaDataFactory.ComplexTrivia.ExtractLineAndSpace(String text, Int32& lines, Int32& spaces) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces\Formatting\Engine\Trivia\TriviaDataFactory.ComplexTrivia.cs:line 49
at Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces.Formatting.AbstractTriviaDataFactory.AbstractComplexTrivia..ctor(OptionSet optionSet, TreeData treeInfo, SyntaxToken token1, SyntaxToken token2) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces\Formatting\Engine\AbstractTriviaDataFactory.AbstractComplexTrivia.cs:line 22
at Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces.Formatting.TriviaDataFactory.Create(SyntaxToken token1, SyntaxToken token2) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces\Formatting\Engine\Trivia\TriviaDataFactory.cs:line 83
at Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces.Formatting.TokenStream.GetOriginalTriviaData(Int32 pairIndex) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces\Formatting\Engine\TokenStream.cs:line 465
at Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces.Formatting.TokenStream.GetOriginalTriviaData(TokenData token1, TokenData token2) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces\Formatting\Engine\TokenStream.cs:line 457
at Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces.Formatting.TokenStream.GetColumn(TokenData tokenData, Func`3 triviaDataGetter) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces\Formatting\Engine\TokenStream.cs:line 412
at Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces.Formatting.FormattingContext.AddAnchorIndentationOperation(AnchorIndentationOperation operation) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces\Formatting\Context\FormattingContext.cs:line 316
at Microsoft.Dynamics.Nav.CodeAnalysis.Utilities.EnumerableExtensions.Do[T](IEnumerable`1 source, Action`1 action) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Utilities\EnumerableExtensions.cs:line 58
at Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces.Formatting.TaskExecutor.SynchronousExecutor.ContinueWith[T1,T2](Task`1 previousTask, Func`2 nextAction, CancellationToken cancellationToken) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces\Formatting\Utilities\TaskExecutor.cs:line 88
at Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces.Formatting.AbstractFormatEngine.FormatAsync(CancellationToken cancellationToken) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces\Formatting\Engine\AbstractFormatEngine.cs:line 111
at Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces.LanguageServices.SyntaxFormattingService.FormatIndividuallyAsync(SyntaxNode node, OptionSet options, IEnumerable`1 rules, IList`1 spansToFormat, CancellationToken cancellationToken) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces\LanguageServices\SyntaxFormattingService.cs:line 148
at Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces.LanguageServices.SyntaxFormattingService.FormatAsync(SyntaxNode node, IEnumerable`1 spans, OptionSet options, IEnumerable`1 rules, CancellationToken cancellationToken) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces\LanguageServices\SyntaxFormattingService.cs:line 93
at Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces.Formatting.Formatter.FormatAsync(SyntaxNode node, IEnumerable`1 spans, Workspace workspace, OptionSet options, IEnumerable`1 rules, CancellationToken cancellationToken) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces\Formatting\Formatter.cs:line 295
at Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces.Formatting.Formatter.FormatAsync(Document document, IEnumerable`1 spans, OptionSet options, IEnumerable`1 rules, CancellationToken cancellationToken) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis.Workspaces\Formatting\Formatter.cs:line 227
at Microsoft.Dynamics.Nav.EditorServices.Protocol.Utility.FormattingHelper.FormatDocument(Document document, CancellationToken cancellationToken) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.EditorServices.Protocol\Utility\FormattingHelper.cs:line 23
at Microsoft.Dynamics.Nav.EditorServices.Protocol.LanguageServer.FormatDocumentRequestHandler.HandleAsync(DocumentFormattingParams request, Int32 requestId, CancellationToken cancellationToken) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.EditorServices.Protocol\LanguageServer\FormatDocumentRequestHandler.cs:line 35
at Microsoft.Dynamics.Nav.EditorServices.Protocol.MessageProtocol.RequestHandlerBase`1.HandleAsync(JToken requestContents, Int32 requestId, CancellationToken cancellationToken) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.EditorServices.Protocol\MessageProtocol\RequestHandlerBase.cs:line 65
at Microsoft.Dynamics.Nav.EditorServices.Protocol.RequestRegistry.Process(Message message) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.EditorServices.Protocol\Endpoints\RequestRegistry.cs:line 80
To Reproduce No clear steps, happens occasionally.
codeunit 50000 "Business Central Test"
{
Subtype = Test;
TestPermissions = Disabled;
var
LibraryAssert: Codeunit "Library Assert";
LibraryPurchases: Codeunit "Library - Purchase";
LibraryDocuments: Codeunit "Library - Incoming Documents";
// [FEATURE] Testing a feature in Business Central
[Test]
procedure OpeningSetupPageShouldCreateSetupRecord()
var
TestSetupPage: TestPage "Setup Page";
TestSetupRecord: Record "Setup Record";
begin
//[SCENARIO #0001] User opens the setup page
//[GIVEN] An environment with no setup record
TestSetupRecord.DeleteAll();
//[WHEN] The setup page is opened
TestSetupPage.OpenView();
//[THEN] A setup record should be inserted
LibraryAssert.IsFalse(TestSetupRecord.IsEmpty(), 'There should be a setup record after the page has been opened, yet it is missing.');
end;
}
Expected behavior For the file to be saved.
Screenshots N/A
5. Versions:
- AL Language: v6.1.381323
- Business Central: Version: US Business Central 17.1 (Platform 17.0.18204.19279 + Application 17.1.18256.19287)
Please note that I can still work, just reporting this for the information!
same sometimes here...currently I'm waiting because of this error. Workaround ideas?
I believe this is a duplicate of #5664. BTW I'm affected too, and quite often. See also https://github.com/microsoft/AL/issues/5664#issuecomment-688080156
Oh yes...today its very annoying :/ And the post is a few months old. I hope it will be fixxed soon :)
For what it's worth, although this does not cause the issue all of the time, doing a mass search and replace in 100+ AL files seems to frequently trigger this issue. I'm currently filling this comment in while waiting for my files to update..... :)
I feel like this has gotten a lot worse in the last few weeks... maybe some update has done it?
Still seeing this quite a bit.