microsoft / AL

Home of the Dynamics 365 Business Central AL Language extension for Visual Studio Code. Used to track issues regarding the latest version of the AL compiler and developer tools available in the Visual Studio Code Marketplace or as part of the AL Developer Preview builds for Dynamics 365 Business Central.
MIT License
732 stars 243 forks source link

Error while saving file, hangs on 'Saving <filename>: Running 'AL Language' Formatter' #6394

Open derkvandenbergh opened 3 years ago

derkvandenbergh commented 3 years ago

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:

Please note that I can still work, just reporting this for the information!

aptMattKoe commented 3 years ago

same sometimes here...currently I'm waiting because of this error. Workaround ideas?

NKarolak commented 3 years ago

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

aptMattKoe commented 3 years ago

Oh yes...today its very annoying :/ And the post is a few months old. I hope it will be fixxed soon :)

MikeGlue commented 3 years ago

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..... :)

dzzzb commented 3 years ago

I feel like this has gotten a lot worse in the last few weeks... maybe some update has done it?

Crunch77 commented 1 year ago

Still seeing this quite a bit.