dart-lang/dartdoc

"Null check operator used on a null value" running "dart doc ." in latest beta

DanTup opened this issue · 6 comments

One of the integration tests for Dart-Code is failing on the beta branch because dart doc is throwing:

PS C:\Dev\Dart-Code\Dart-Code\src\test\test_projects\hello_world> dart doc .
Documenting hello_world...
Discovering libraries...
Linking elements...
Precaching local docs for 17046 elements...
Initialized dartdoc with 1 library
Generating docs for library everything.dart from package:hello_world/everything.dart...
  warning: everything has no library level documentation comments
    from everything: (file:///c:/dev/dart-code/dart-code/src/test/test_projects/hello_world/lib/everything.dart:1:9)

dartdoc 8.0.10-dev (/C:/Dev/Dart-Code/Dart-Code/src/test/test_projects/hello_world/dartdev) failed: Null check operator used on a null value
#0      ModelElement._constructFromElementDeclaration (package:dartdoc/src/model/model_element.dart:277:71)
dart-lang/sdk#1      new ModelElement.for_ (package:dartdoc/src/model/model_element.dart:230:40)
dart-lang/sdk#2      new ModelElement.forElement (package:dartdoc/src/model/model_element.dart:106:25)
dart-lang/sdk#3      Nameable.getModelForElement (package:dartdoc/src/model/nameable.dart:66:20)
dart-lang/sdk#4      ModelElement.definingLibrary (package:dartdoc/src/model/model_element.dart:455:7)
dart-lang/sdk#5      ModelElement.canonicalLibrary.<anonymous closure> (package:dartdoc/src/model/model_element.dart:469:52)
dart-lang/sdk#6      ModelElement.canonicalLibrary (package:dartdoc/src/model/model_element.dart:487:4)
dart-lang/sdk#7      ModelElement.canonicalLibrary (package:dartdoc/src/model/model_element.dart)
dart-lang/sdk#8      PackageGraph.findCanonicalModelElementFor (package:dartdoc/src/model/package_graph.dart:772:28)
dart-lang/sdk#9      ModelElement.canonicalModelElement.<anonymous closure> (package:dartdoc/src/model/model_element.dart:442:25)
dart-lang/sdk#10     ModelElement.canonicalModelElement (package:dartdoc/src/model/model_element.dart:444:4)
dart-lang/sdk#11     ModelElement.canonicalModelElement (package:dartdoc/src/model/model_element.dart)
dart-lang/sdk#12     ModelElement.href (package:dartdoc/src/model/model_element.dart:630:20)
dart-lang/sdk#13     ModelElement.linkedName.<anonymous closure> (package:dartdoc/src/model/model_element.dart:690:23)
dart-lang/sdk#14     ModelElement.linkedName (package:dartdoc/src/model/model_element.dart:700:4)
dart-lang/sdk#15     ModelElement.linkedName (package:dartdoc/src/model/model_element.dart)
dart-lang/sdk#16     ParameterizedElementTypeRendererHtml.renderLinkedName (package:dartdoc/src/render/element_type_renderer.dart:102:34)
dart-lang/sdk#17     Rendered.linkedName (package:dartdoc/src/element_type.dart:397:44)
dart-lang/sdk#18     Rendered.linkedName (package:dartdoc/src/element_type.dart)
dart-lang/sdk#19     __deduplicated_lib_templates__instance_fields_html_partial_property_0 (package:dartdoc/src/generator/templates.aot_renderers_for_html.dart:4515:35)
dart-lang/sdk#20     _deduplicated_lib_templates__instance_fields_html (package:dartdoc/src/generator/templates.aot_renderers_for_html.dart:4487:11)
dart-lang/sdk#21     _renderClass_partial_instance_fields_10 (package:dartdoc/src/generator/templates.aot_renderers_for_html.dart:2610:5)
dart-lang/sdk#22     renderClass (package:dartdoc/src/generator/templates.aot_renderers_for_html.dart:369:16)
dart-lang/sdk#23     HtmlAotTemplates.renderClass (package:dartdoc/src/generator/templates.dart:143:30)
dart-lang/sdk#24     GeneratorBackend.generateClass (package:dartdoc/src/generator/generator_backend.dart:131:29)
dart-lang/sdk#25     HtmlGeneratorBackend.generateClass (package:dartdoc/src/generator/html_generator.dart:40:11)
dart-lang/sdk#26     GeneratorFrontEnd._generateDocs (package:dartdoc/src/generator/generator_frontend.dart:162:29)
dart-lang/sdk#27     GeneratorFrontEnd.generate (package:dartdoc/src/generator/generator_frontend.dart:37:25)
<asynchronous suspension>
dart-lang/sdk#28     Dartdoc.generateDocsBase (package:dartdoc/src/dartdoc.dart:203:5)
<asynchronous suspension>
dart-lang/sdk#29     Dartdoc.generateDocs (package:dartdoc/src/dartdoc.dart:241:24)
<asynchronous suspension>
dart-lang/sdk#30     Dartdoc.executeGuarded.<anonymous closure> (package:dartdoc/src/dartdoc.dart:273:9)
<asynchronous suspension>

The project looks like:

pubspec.yaml

name: hello_world
publish_to: none

environment:
  sdk: '>=2.12.0 <4.0.0'

dependencies:
  http:

dartdoc_options.yaml

dartdoc:
  include:
    - everything

lib/everything.dart

library everything;

import 'package:http/http.dart' as http;

/// A
class MyTestClass {
  http.Client? myTestHttpClient;
}

Remove the myTestHttpClient field seems to prevent the issue.

(@srawlins I'm not certain if this is best raised here or in dartdoc, but if this is the wrong place and you have powers, could you move it there? this seems like a beta-only regression)

Summary: dart doc fails with a "Null check operator used on a null value" error when documenting a class with a nullable field. This issue appears to be specific to the Dart beta branch and is not present in stable releases.

The ! causing the exception is this one here:

LibraryElement() => packageGraph.findButDoNotCreateLibraryFor(e)!,

Hi @DanTup, which beta branch? Beta branch of the Dart SDK? I'll start trying to repro locally.

I can reproduce with Dart 3.5.0-323.2.beta.

The issue disappears if you remove or comment out the lines in dartdoc_options.yaml.

The culprit commit is 12d271a.