microsoft / microsoft/AL

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

Open
#6,394 6 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

bug
Dominant language
PowerShell
Stars
881
Forks
285
Avg merge
3d 36m
Merged PRs (30d)
1

Description

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!

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with the textDocument/formatting entry point in Microsoft.Dynamics.Nav.EditorServices.Protocol.LanguageServer.FormatDocumentRequestHandler and trace the reported failure through FormattingHelper and StringExtensions.GetColumnFromLineOffset. The issue provides no reliable reproduction steps, so investigate the formatter stack trace and establish a case where saving hangs or returns “Unexpected false.”

Written by the indexing model from the issue text.

Assessment

Tech stack
vscode
Domain
tooling
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.