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
722 stars 242 forks source link

Word Layout Compile Bug #7672

Closed GestiSam closed 4 months ago

GestiSam commented 4 months ago

1. Describe the bug While compiling a report extension with an existing Layout, the compiler gives the current error: Failure while emitting metadata for object:'ReportExtension gsStandardSalesInvoice' (Length cannot be less than zero. (Parameter 'length')))

2. To Reproduce Steps to reproduce the behavior:

  1. Create a new table extension and report extension

tableextension 60100 gsSalesLine extends "Sales Line" { fields { field(60100; gsUnitPriceAfterDisc; Decimal) { Caption = 'Unit price (after discount)'; DataClassification = CustomerContent; Editable = false; } } } reportextension 60101 gsStandardSalesOrderConf extends "Standard Sales - Order Conf." { WordLayout = './src/layout/gsStandardSalesOrderConf.docx'; dataset { add(Line) { column(gsUnitPriceAfterDisc; gsUnitPriceAfterDisc) { } } } } gsStandardSalesOrderConf.docx

3. Expected behavior Compile and get an updated Dataset in the Word File

4. Actual behavior Getting this error: [Error - 10:30:52 AM] Please report this issue to https://github.com/microsoft/al/issues including information on how to reproduce it, if possible. Processing of message 'al/createPackage' failed with error: 'One or more errors occurred. (Failure while emitting metadata for object:'ReportExtension gsStandardSalesInvoice' (Length cannot be less than zero. (Parameter 'length'))) (Failure while emitting metadata for object:'ReportExtension gsStandardSalesOrderConf' (Length cannot be less than zero. (Parameter 'length')))' Details: System.AggregateException: One or more errors occurred. (Failure while emitting metadata for object:'ReportExtension gsStandardSalesInvoice' (Length cannot be less than zero. (Parameter 'length'))) (Failure while emitting metadata for object:'ReportExtension gsStandardSalesOrderConf' (Length cannot be less than zero. (Parameter 'length'))) ---> System.AggregateException: Failure while emitting metadata for object:'ReportExtension gsStandardSalesInvoice' (Length cannot be less than zero. (Parameter 'length')) ---> System.ArgumentOutOfRangeException: Length cannot be less than zero. (Parameter 'length') at System.String.Substring(Int32 startIndex, Int32 length) at Microsoft.Dynamics.Nav.CodeAnalysis.Emit.ReportWordUtilities.<>c.b6_0(String line) in D:\a_work\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Emitter\ReportEmitterUtilities\ReportWordUtilities.cs:line 137 at System.Linq.Enumerable.SelectArrayIterator2.MoveNext() at System.String.Join(String separator, IEnumerable1 values) at Microsoft.Dynamics.Nav.CodeAnalysis.Emit.ReportWordUtilities.FillXmlPartDataWithExtendedInfo(String oldXmlPart) in D:\a_work\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Emitter\ReportEmitterUtilities\ReportWordUtilities.cs:line 128 at Microsoft.Dynamics.Nav.CodeAnalysis.Emit.ReportWordUtilities.UpdateWordFileIfNeeded(IFileSystem fileSystem, String docName, String officeCustomXmlPart, String officeCustomXmlPart_Extended) in D:\a_work\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Emitter\ReportEmitterUtilities\ReportWordUtilities.cs:line 62 at Microsoft.Dynamics.Nav.CodeAnalysis.Emit.ReportWordUtilities.GenerateWordLayout(ReportTypeSymbol report, IFileSystem fileSystem, String docName, Compilation compilation) in D:\a_work\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Emitter\ReportEmitterUtilities\ReportWordUtilities.cs:line 37 at Microsoft.Dynamics.Nav.CodeAnalysis.Emit.ReportLayoutsGenerator.GenerateLayout(ReportTypeSymbol symbol, ApplicationObjectTypeSymbol declaringSymbol, DiagnosticBag diagnostics, ReportLayoutSymbol layoutSymbol, Action`4 generator) in D:\a_work\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Emitter\ReportLayoutsGenerator.cs:line 46 at Microsoft.Dynamics.Nav.CodeAnalysis.Emit.ReportExtensionLayoutsEmitter.Emit(DiagnosticBag diagnostics) in D:\a_work\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Emitter\ReportExtensionLayoutsEmitter.cs:line 21 at Microsoft.Dynamics.Nav.CodeAnalysis.MethodCompiler.<>cDisplayClass15_0.b0(DiagnosticBag diagnostics) in D:\a_work\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Compiler\MethodCompiler.cs:line 226 at Microsoft.Dynamics.Nav.CodeAnalysis.MethodCompiler.EmitNonObjectCode(Symbol objectType, Action1 emitter) in D:\a\_work\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Compiler\MethodCompiler.cs:line 205 --- End of inner exception stack trace --- at Microsoft.Dynamics.Nav.CodeAnalysis.MethodCompiler.EmitNonObjectCode(Symbol objectType, Action1 emitter) in D:\a_work\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Compiler\MethodCompiler.cs:line 209 at Microsoft.Dynamics.Nav.CodeAnalysis.MethodCompiler.PreMetadataEmit(ObjectTypeSymbol containingType) in D:\a_work\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Compiler\MethodCompiler.cs:line 221 at Microsoft.Dynamics.Nav.CodeAnalysis.MethodCompiler.CompileObject(ObjectTypeSymbol containingType) in D:\a_work\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Compiler\MethodCompiler.cs:line 189 at Microsoft.Dynamics.Nav.CodeAnalysis.MethodCompiler.VisitObjectType(ObjectTypeSymbol symbol) in D:\a_work\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Compiler\MethodCompiler.cs:line 161 at Microsoft.Dynamics.Nav.CodeAnalysis.Symbols.SymbolVisitor.VisitApplicationObjectType(ApplicationObjectTypeSymbol node) in D:\a_work\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Generated\SymbolVisitor.Generated.cs:line 351 at Microsoft.Dynamics.Nav.CodeAnalysis.Symbols.SymbolVisitor.VisitApplicationObjectExtensionType(ApplicationObjectExtensionTypeSymbol node) in D:\a_work\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Generated\SymbolVisitor.Generated.cs:line 356 at Microsoft.Dynamics.Nav.CodeAnalysis.Symbols.SymbolVisitor.VisitReportExtensionType(ReportExtensionTypeSymbol node) in D:\a_work\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Generated\SymbolVisitor.Generated.cs:line 286 at Microsoft.Dynamics.Nav.CodeAnalysis.Symbols.ReportExtensionTypeSymbol.Accept(SymbolVisitor visitor) in D:\a_work\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Generated\Symbols.Generated.cs:line 1208 at Microsoft.Dynamics.Nav.CodeAnalysis.MethodCompiler.<>cDisplayClass11_0.b0(Symbol memberSymbol) in D:\a_work\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Compiler\MethodCompiler.cs:line 129 --- End of inner exception stack trace --- at Microsoft.Dynamics.Nav.CodeAnalysis.MethodCompiler.CompileModule(ModuleSymbol moduleSymbol) in D:\a_work\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Compiler\MethodCompiler.cs:line 140 at Microsoft.Dynamics.Nav.CodeAnalysis.MethodCompiler.CompileMethodBodies(Compilation compilation, ModuleBuilder moduleBeingBuiltOpt, Boolean hasDeclarationErrors, DiagnosticBag diagnostics, Predicate1 filterOpt, Predicate1 radCompilationFilter, CancellationToken cancellationToken) in D:\a_work\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Compiler\MethodCompiler.cs:line 103 at Microsoft.Dynamics.Nav.CodeAnalysis.Compilation.CompileImpl(ModuleBuilder moduleBuilder, Boolean emittingPdb, DiagnosticBag diagnostics, Predicate1 filterOpt, Predicate1 radCompilationFilter, CancellationToken cancellationToken) in D:\a_work\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Compilation\Compilation.cs:line 1202 at Microsoft.Dynamics.Nav.CodeAnalysis.Compilation.Compile(ModuleBuilder moduleBuilder, Boolean emittingPdb, DiagnosticBag diagnostics, Predicate1 filterOpt, Predicate1 radCompilationFilter, CancellationToken cancellationToken) in D:\a_work\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Compilation\Compilation.cs:line 1174 at Microsoft.Dynamics.Nav.CodeAnalysis.CommandLine.CommonCompiler.PackageTheModule(Compilation compilation, CompilerTextWriter consoleOutput, CancellationToken cancellationToken, ErrorLogger errorLogger, AnalyzerDriver analyzerDriver, Predicate1 filterOpt, Predicate1 radCompilationFilter) in D:\a_work\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\CommandLine\CommonCompiler.cs:line 793 at Microsoft.Dynamics.Nav.CodeAnalysis.CommandLine.CommonCompiler.RunCoreImpl(CompilerTextWriter consoleOutput, ErrorLogger errorLogger, Compilation compilation, AnalyzerDriver analyzerDriver, IEnumerable1 analyzerExceptionDiagnostics, IEnumerable1 additionalTextFiles, CancellationToken cancellationToken) in D:\a_work\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\CommandLine\CommonCompiler.cs:line 560 at Microsoft.Dynamics.Nav.CodeAnalysis.CommandLine.CommonCompiler.RunCore(CompilerTextWriter consoleOutput, ErrorLogger errorLogger, ITelemetryService telemetryService, CancellationToken cancellationToken) in D:\a_work\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\CommandLine\CommonCompiler.cs:line 490 at Microsoft.Dynamics.Nav.CodeAnalysis.CommandLine.CommonCompiler.Run(CompilerTextWriter consoleOutput, ITelemetryService telemetryService, CancellationToken cancellationToken) in D:\a_work\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\CommandLine\CommonCompiler.cs:line 340 at Microsoft.Dynamics.Nav.EditorServices.Protocol.Utility.ActiveProjectBuilder.Build(VsCodeWorkspace workspace, Project builtProject, StreamingTextWriter outputWriter, Boolean isRad, IList1 args, CancellationToken cancellationToken, IResponseQueue responseQueue, ITelemetryService telemetryService, Boolean forceBuild, IList1 outputFiles, CustomTelemetryEvent telemetryEvent, String requestVsCodeExtensionVersion) in D:\a_work\1\s\source\Prod\Microsoft.Dynamics.Nav.EditorServices.Protocol\Utility\ActiveProjectBuilder.cs:line 204 at Microsoft.Dynamics.Nav.EditorServices.Protocol.Utility.ActiveProjectBuilder.BuildWorkspaceAsync(CancellationToken cancellationToken, IFileSystem fileSystem, VsCodeWorkspace workspace, String projectDir, IList1 args, Boolean buildDependencyPackage, Boolean isRad, IResponseQueue responseQueue, Boolean forceBuildOfAllDependencies, CustomTelemetryEvent telemetryEvent, ITelemetryService telemetryService, String vsCodeExtensionVersion) in D:\a\_work\1\s\source\Prod\Microsoft.Dynamics.Nav.EditorServices.Protocol\Utility\ActiveProjectBuilder.cs:line 115 at Microsoft.Dynamics.Nav.EditorServices.Protocol.LanguageServer.Extensions.CreatePackageRequestHandler.HandleAsync(CreatePackageRequest request, Int32 requestId, CancellationToken cancellationToken) in D:\a\_work\1\s\source\Prod\Microsoft.Dynamics.Nav.EditorServices.Protocol\LanguageServer\Extensions\CreatePackageRequestHandler.cs:line 37 at Microsoft.Dynamics.Nav.EditorServices.Protocol.MessageProtocol.RequestHandlerBase1.HandleAsync(JToken requestContents, Int32 requestId, CancellationToken cancellationToken) in D:\a_work\1\s\source\Prod\Microsoft.Dynamics.Nav.EditorServices.Protocol\MessageProtocol\RequestHandlerBase.cs:line 84 at Microsoft.Dynamics.Nav.EditorServices.Protocol.RequestRegistry.Process(Message message) in D:\a_work\1\s\source\Prod\Microsoft.Dynamics.Nav.EditorServices.Protocol\Endpoints\RequestRegistry.cs:line 106 ---> (Inner Exception #1) System.AggregateException: Failure while emitting metadata for object:'ReportExtension gsStandardSalesOrderConf' (Length cannot be less than zero. (Parameter 'length')) ---> System.ArgumentOutOfRangeException: Length cannot be less than zero. (Parameter 'length') at System.String.Substring(Int32 startIndex, Int32 length) at Microsoft.Dynamics.Nav.CodeAnalysis.Emit.ReportWordUtilities.<>c.b6_0(String line) in D:\a_work\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Emitter\ReportEmitterUtilities\ReportWordUtilities.cs:line 137 at System.Linq.Enumerable.SelectArrayIterator2.MoveNext() at System.String.Join(String separator, IEnumerable1 values) at Microsoft.Dynamics.Nav.CodeAnalysis.Emit.ReportWordUtilities.FillXmlPartDataWithExtendedInfo(String oldXmlPart) in D:\a_work\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Emitter\ReportEmitterUtilities\ReportWordUtilities.cs:line 128 at Microsoft.Dynamics.Nav.CodeAnalysis.Emit.ReportWordUtilities.UpdateWordFileIfNeeded(IFileSystem fileSystem, String docName, String officeCustomXmlPart, String officeCustomXmlPart_Extended) in D:\a_work\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Emitter\ReportEmitterUtilities\ReportWordUtilities.cs:line 62 at Microsoft.Dynamics.Nav.CodeAnalysis.Emit.ReportWordUtilities.GenerateWordLayout(ReportTypeSymbol report, IFileSystem fileSystem, String docName, Compilation compilation) in D:\a_work\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Emitter\ReportEmitterUtilities\ReportWordUtilities.cs:line 37 at Microsoft.Dynamics.Nav.CodeAnalysis.Emit.ReportLayoutsGenerator.GenerateLayout(ReportTypeSymbol symbol, ApplicationObjectTypeSymbol declaringSymbol, DiagnosticBag diagnostics, ReportLayoutSymbol layoutSymbol, Action4 generator) in D:\a\_work\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Emitter\ReportLayoutsGenerator.cs:line 46 at Microsoft.Dynamics.Nav.CodeAnalysis.Emit.ReportExtensionLayoutsEmitter.Emit(DiagnosticBag diagnostics) in D:\a\_work\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Emitter\ReportExtensionLayoutsEmitter.cs:line 21 at Microsoft.Dynamics.Nav.CodeAnalysis.MethodCompiler.<>c__DisplayClass15_0.<PreMetadataEmit>b__0(DiagnosticBag diagnostics) in D:\a\_work\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Compiler\MethodCompiler.cs:line 226 at Microsoft.Dynamics.Nav.CodeAnalysis.MethodCompiler.EmitNonObjectCode(Symbol objectType, Action1 emitter) in D:\a_work\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Compiler\MethodCompiler.cs:line 205 --- End of inner exception stack trace --- at Microsoft.Dynamics.Nav.CodeAnalysis.MethodCompiler.EmitNonObjectCode(Symbol objectType, Action`1 emitter) in D:\a_work\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Compiler\MethodCompiler.cs:line 209 at Microsoft.Dynamics.Nav.CodeAnalysis.MethodCompiler.PreMetadataEmit(ObjectTypeSymbol containingType) in D:\a_work\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Compiler\MethodCompiler.cs:line 221 at Microsoft.Dynamics.Nav.CodeAnalysis.MethodCompiler.CompileObject(ObjectTypeSymbol containingType) in D:\a_work\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Compiler\MethodCompiler.cs:line 189 at Microsoft.Dynamics.Nav.CodeAnalysis.MethodCompiler.VisitObjectType(ObjectTypeSymbol symbol) in D:\a_work\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Compiler\MethodCompiler.cs:line 161 at Microsoft.Dynamics.Nav.CodeAnalysis.Symbols.SymbolVisitor.VisitApplicationObjectType(ApplicationObjectTypeSymbol node) in D:\a_work\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Generated\SymbolVisitor.Generated.cs:line 351 at Microsoft.Dynamics.Nav.CodeAnalysis.Symbols.SymbolVisitor.VisitApplicationObjectExtensionType(ApplicationObjectExtensionTypeSymbol node) in D:\a_work\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Generated\SymbolVisitor.Generated.cs:line 356 at Microsoft.Dynamics.Nav.CodeAnalysis.Symbols.SymbolVisitor.VisitReportExtensionType(ReportExtensionTypeSymbol node) in D:\a_work\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Generated\SymbolVisitor.Generated.cs:line 286 at Microsoft.Dynamics.Nav.CodeAnalysis.Symbols.ReportExtensionTypeSymbol.Accept(SymbolVisitor visitor) in D:\a_work\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Generated\Symbols.Generated.cs:line 1208 at Microsoft.Dynamics.Nav.CodeAnalysis.MethodCompiler.<>c__DisplayClass11_0.b__0(Symbol memberSymbol) in D:\a_work\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Compiler\MethodCompiler.cs:line 129<---

5. Versions:

thloke commented 4 months ago

I have a fix for this. The reason why this happens is quite silly, we're not handling lines that are whitespace-only in the custom XML part of the word document. Usually this XML part is not hand-edited but generated by Word, so usually that assumption is fine but in this case the layout has one such line.

A possible workaround to unblock you while we validate and release the fix is to re-create the word layout. That might be faster than waiting for the fix to be released.

GestiSam commented 4 months ago

Yes that's what I did, regenerated the layout and copied the content over from the old layout. Thanks for the information about the eventual fix.

JesperSchulz commented 4 months ago

The fix for this issue has been checked in to the master branch. It will be available in the bcinsider.azurecr.io/bcsandbox-master Docker image starting from platform build number 25.0.17268.0 and VS Code Extension Version 14.0.958538.

If you don’t have access to these images you need to become part of the Ready2Go program: aka.ms/readytogo

For more details on code branches and docker images please read: https://blogs.msdn.microsoft.com/nav/2018/05/03/al-developer-previews-multiple-releases-and-github/ https://freddysblog.com/2020/06/25/working-with-artifacts/