[kernel] Fix uri on some constants

Change-Id: I8b23563df3765bb076c851179bdbb02ad70671bf
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/368402
Commit-Queue: Jens Johansen <jensj@google.com>
Reviewed-by: Johnni Winther <johnniwinther@google.com>
This commit is contained in:
Jens Johansen 2024-05-29 14:01:32 +00:00 committed by Commit Queue
parent ed4f2425f5
commit 727796e692
28 changed files with 124 additions and 62 deletions

View file

@ -2385,6 +2385,10 @@ class ConstantsTransformer extends RemovingTransformer {
return new FileUriConstantExpression(constantExpression.constant,
type: constantExpression.type, fileUri: node.fileUri)
..fileOffset = node.fileOffset;
} else if (node is FileUriConstantExpression) {
return new FileUriConstantExpression(constantExpression.constant,
type: constantExpression.type, fileUri: node.fileUri)
..fileOffset = node.fileOffset;
}
return constantExpression;
}

View file

@ -480,6 +480,7 @@ dirname
dirtify
dirtifying
dirty
disagrees
disallow
disambiguating
disambiguation

View file

@ -71,7 +71,7 @@ abstract class _B&Object&Error extends core::Object implements core::Error /*isA
}
@#C4
@#C10
@#C12
@/* from org-dartlang-sdk:///sdk/lib/core/errors.dart */ #C12
external static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/errors_patch.dart */ _throw(core::Object error, core::StackTrace stackTrace) → Never;
}
class B extends self::_B&Object&Error {

View file

@ -63,7 +63,7 @@ abstract class _B&Object&Error extends core::Object implements core::Error /*isA
}
@#C4
@#C10
@#C12
@/* from org-dartlang-sdk:///sdk/lib/core/errors.dart */ #C12
external static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/errors_patch.dart */ _throw(core::Object error, core::StackTrace stackTrace) → Never;
}
class B extends self::_B&Object&Error {

View file

@ -29,7 +29,7 @@ import "dart:_internal";
typedef Alias<T extends core::num> = test::Class<T>;
typedef AliasImpl<T extends core::num> = test::ClassImpl<T>;
@#C13
@/* from org-dartlang-testcase:///patch_lib.dart */ #C13
class Class<T extends core::Object? = dynamic> extends core::Object {
@#C13
constructor •({core::bool defaultValue = #C14, required test::Class::T% value}) → test::Class<test::Class::T%>
@ -54,7 +54,7 @@ class Class<T extends core::Object? = dynamic> extends core::Object {
static method /* from org-dartlang-testcase:///patch_lib.dart */ _#redirect2#tearOff<T extends core::Object? = dynamic>({core::bool defaultValue = #C14, required test::Class::_#redirect2#tearOff::T% value}) → test::Class<test::Class::_#redirect2#tearOff::T%>
return new test::ClassImpl::patched<test::Class::_#redirect2#tearOff::T%>(defaultValue: defaultValue, value: value);
}
@#C13
@/* from org-dartlang-testcase:///patch_lib.dart */ #C13
class ClassImpl<T extends core::Object? = dynamic> extends core::Object implements test::Class<test::ClassImpl::T%> {
constructor •({core::bool defaultValue = #C14, required test::ClassImpl::T% value}) → test::ClassImpl<test::ClassImpl::T%>
: super core::Object::•()

View file

@ -29,7 +29,7 @@ import "dart:_internal";
typedef Alias<T extends core::num> = test::Class<T>;
typedef AliasImpl<T extends core::num> = test::ClassImpl<T>;
@#C13
@/* from org-dartlang-testcase:///patch_lib.dart */ #C13
class Class<T extends core::Object? = dynamic> extends core::Object {
@#C13
constructor •({core::bool defaultValue = #C14, required test::Class::T% value}) → test::Class<test::Class::T%>
@ -54,7 +54,7 @@ class Class<T extends core::Object? = dynamic> extends core::Object {
static method /* from org-dartlang-testcase:///patch_lib.dart */ _#redirect2#tearOff<T extends core::Object? = dynamic>({core::bool defaultValue = #C14, required test::Class::_#redirect2#tearOff::T% value}) → test::Class<test::Class::_#redirect2#tearOff::T%>
return new test::ClassImpl::patched<test::Class::_#redirect2#tearOff::T%>(defaultValue: defaultValue, value: value);
}
@#C13
@/* from org-dartlang-testcase:///patch_lib.dart */ #C13
class ClassImpl<T extends core::Object? = dynamic> extends core::Object implements test::Class<test::ClassImpl::T%> {
constructor •({core::bool defaultValue = #C14, required test::ClassImpl::T% value}) → test::ClassImpl<test::ClassImpl::T%>
: super core::Object::•()

View file

@ -15,7 +15,7 @@ import "dart:core" as core;
import "dart:_internal";
@#C1
@/* from org-dartlang-testcase:///patch_lib.dart */ #C1
class Class extends core::Object {
final field core::bool defaultValue /* from org-dartlang-testcase:///patch_lib.dart */;
const constructor _internal({core::bool defaultValue = #C2}) → test::Class

View file

@ -35,7 +35,7 @@ import "dart:core" as core;
import "dart:_internal";
@#C3
@/* from org-dartlang-testcase:///patch_lib.dart */ #C3
class Class extends core::Object /*hasConstConstructor*/ {
final field core::bool defaultValue /* from org-dartlang-testcase:///patch_lib.dart */;
constructor _privateInjected() → test::Class
@ -60,7 +60,7 @@ class Class extends core::Object /*hasConstConstructor*/ {
: test::Class::defaultValue = true, super core::Object::•()
;
}
@#C3
@/* from org-dartlang-testcase:///patch_lib.dart */ #C3
class Class2 extends core::Object {
final field core::int injectedField /* from org-dartlang-testcase:///patch_lib.dart */;
field core::int field;

View file

@ -23,7 +23,7 @@ import "dart:core" as core;
import "dart:_internal";
@#C1
@/* from org-dartlang-testcase:///patch_lib.dart */ #C1
class Class extends core::Object {
final field core::bool defaultValue /* from org-dartlang-testcase:///patch_lib.dart */;
const constructor _internal({core::bool defaultValue = #C2}) → test::Class

View file

@ -48,8 +48,8 @@ import "dart:core" as core;
import "dart:_internal";
import "dart:_internal";
@#C1
@#C1
@/* from org-dartlang-testcase:///patch_lib1.dart */ #C1
@/* from org-dartlang-testcase:///patch_lib2.dart */ #C1
class Class extends core::Object {
synthetic constructor •() → self2::Class
: super core::Object::•()

View file

@ -38,7 +38,7 @@ class InjectedClass extends core::Object { // from org-dartlang-testcase:///patc
: super core::Object::•()
;
}
@#C1
@/* from org-dartlang-testcase:///patch_lib.dart */ #C1
class Class extends core::Object {
synthetic constructor •() → test::Class
: super core::Object::•()

View file

@ -18,8 +18,8 @@ class _ArraySize<T extends core::Object? = dynamic> extends core::Object impleme
: self2::_ArraySize::foo = foo, super core::Object::•()
;
}
@#C1
@#C4
@/* from org-dartlang-testcase:///patch_lib.dart */ #C1
@/* from org-dartlang-testcase:///patch_lib.dart */ #C4
class Array<T extends core::Object? = dynamic> extends core::Object {
@#C1
static factory /* from org-dartlang-testcase:///patch_lib.dart */ •<T extends core::Object? = dynamic>(core::int foo) → self2::Array<self2::Array::•::T%> /* redirection-target: self2::_ArraySize::•<self2::Array::•::T%>*/

View file

@ -18,7 +18,7 @@ import "dart:core" as core;
import "dart:_internal";
@#C1
@/* from org-dartlang-testcase:///patch_lib.dart */ #C1
class Class extends core::Object {
constructor _internal({core::bool value = #C2}) → test::Class
: super core::Object::•()
@ -44,7 +44,7 @@ abstract class _SubClass&Class&Mixin extends test::Class implements test::Mixin
: super test::Class::_internal(value: value)
;
}
@#C1
@/* from org-dartlang-testcase:///patch_lib.dart */ #C1
class SubClass extends test::_SubClass&Class&Mixin {
constructor _internal() → test::SubClass
: super test::_SubClass&Class&Mixin::_internal(value: true)

View file

@ -25,8 +25,8 @@ import "dart:core" as core;
import "dart:_internal";
import "dart:_internal";
@#C1
@#C1
@/* from org-dartlang-testcase:///patch_lib1.dart */ #C1
@/* from org-dartlang-testcase:///patch_lib2.dart */ #C1
class Class extends core::Object {
synthetic constructor •() → test::Class
: super core::Object::•()
@ -37,7 +37,7 @@ class Class extends core::Object {
@#C1
method /* from org-dartlang-testcase:///patch_lib2.dart */ method2() → core::int
return 87;
@#C1
@/* from org-dartlang-testcase:///patch_lib1.dart */ #C1
@#C1
method /* from org-dartlang-testcase:///patch_lib2.dart */ method3() → core::int
return 123;

View file

@ -33,7 +33,7 @@ import "dart:core" as core;
import "dart:_internal";
@#C1
@/* from org-dartlang-testcase:///patch_lib.dart */ #C1
class Class extends core::Object {
synthetic constructor •() → test::Class
: super core::Object::•()
@ -47,7 +47,7 @@ import "dart:core" as core;
import "dart:_internal";
@#C1
@/* from org-dartlang-testcase:///extra_patch_lib.dart */ #C1
class Extra extends core::Object {
synthetic constructor •() → ext::Extra
: super core::Object::•()

View file

@ -5,7 +5,7 @@ import "dart:test";
static method main() → dynamic {}
@#C3
@/* from org-dartlang-testcase:///patch_lib.dart */ #C3
@#C5
library;
import self as self2;
@ -14,17 +14,17 @@ import "dart:_internal" as _in;
import "dart:_internal";
@#C6
@#C8
@/* from org-dartlang-testcase:///patch_lib.dart */ #C6
@/* from org-dartlang-testcase:///patch_lib.dart */ #C8
@#C10
class Class<@#C12 @#C14 T extends core::Object? = dynamic> extends core::Object {
@#C6
@#C16
@#C18
@/* from org-dartlang-testcase:///origin_lib.dart */ #C18
external constructor •() → self2::Class<self2::Class::T%>;
@#C6
@#C20
@#C22
@/* from org-dartlang-testcase:///origin_lib.dart */ #C22
external method /* from org-dartlang-testcase:///patch_lib.dart */ method<@#C24 S extends core::Object? = dynamic>() → void;
}

View file

@ -96,7 +96,7 @@ class ExistingOriginClass#0#1 extends core::Object { // from org-dartlang-testca
: super core::Object::•()
;
}
@#C1
@/* from org-dartlang-testcase:///patch_lib.dart */ #C1
class Class extends core::Object {
@#C1
constructor missingOriginConstructor() → self2::Class

View file

@ -118,37 +118,37 @@ class SuperClass extends core::Object {
: super core::Object::•()
;
}
@#C1
@/* from org-dartlang-testcase:///patch_lib.dart */ #C1
abstract class Class1a extends core::Object {
synthetic constructor •() → test::Class1a
: super core::Object::•()
;
}
@#C1
@/* from org-dartlang-testcase:///patch_lib.dart */ #C1
class Class1b extends core::Object {
synthetic constructor •() → test::Class1b
: super core::Object::•()
;
}
@#C1
@/* from org-dartlang-testcase:///patch_lib.dart */ #C1
class Class2a extends test::SuperClass {
synthetic constructor •() → test::Class2a
: super test::SuperClass::•()
;
}
@#C1
@/* from org-dartlang-testcase:///patch_lib.dart */ #C1
class Class2b extends core::Object {
synthetic constructor •() → test::Class2b
: super core::Object::•()
;
}
@#C1
@/* from org-dartlang-testcase:///patch_lib.dart */ #C1
class Class3a extends core::Object implements test::Interface {
synthetic constructor •() → test::Class3a
: super core::Object::•()
;
}
@#C1
@/* from org-dartlang-testcase:///patch_lib.dart */ #C1
class Class3b extends core::Object {
synthetic constructor •() → test::Class3b
: super core::Object::•()
@ -159,31 +159,31 @@ abstract class _Class4a&Object&Mixin extends core::Object implements test::Mixin
: super core::Object::•()
;
}
@#C1
@/* from org-dartlang-testcase:///patch_lib.dart */ #C1
class Class4a extends test::_Class4a&Object&Mixin {
synthetic constructor •() → test::Class4a
: super test::_Class4a&Object&Mixin::•()
;
}
@#C1
@/* from org-dartlang-testcase:///patch_lib.dart */ #C1
class Class4b extends core::Object {
synthetic constructor •() → test::Class4b
: super core::Object::•()
;
}
@#C1
@/* from org-dartlang-testcase:///patch_lib.dart */ #C1
class Class5a extends core::Object {
@#C1
static factory /* from org-dartlang-testcase:///patch_lib.dart */ •() → test::Class5a /* redirection-target: test::Class5aImpl::• */
return new test::Class5aImpl::•();
}
@#C1
@/* from org-dartlang-testcase:///patch_lib.dart */ #C1
class Class5aImpl extends core::Object implements test::Class5a {
synthetic constructor •() → test::Class5aImpl
: super core::Object::•()
;
}
@#C1
@/* from org-dartlang-testcase:///patch_lib.dart */ #C1
class Class5b extends core::Object {
@#C1
static factory /* from org-dartlang-testcase:///patch_lib.dart */ •() → test::Class5b /* redirection-target: test::Class5bImpl::• */
@ -193,13 +193,13 @@ class Class5b extends core::Object {
factory Class5b() = Class5bImpl;
^";
}
@#C1
@/* from org-dartlang-testcase:///patch_lib.dart */ #C1
class Class5bImpl extends core::Object {
synthetic constructor •() → test::Class5bImpl
: super core::Object::•()
;
}
@#C1
@/* from org-dartlang-testcase:///patch_lib.dart */ #C1
class Class5c extends core::Object {
@#C1
static factory /* from org-dartlang-testcase:///patch_lib.dart */ •() → test::Class5c /* redirection-target: test::Class5cImpl::• */
@ -209,13 +209,13 @@ class Class5c extends core::Object {
factory Class5c() = Class5cImpl;
^";
}
@#C1
@/* from org-dartlang-testcase:///patch_lib.dart */ #C1
class Class5cImpl extends core::Object {
synthetic constructor •() → test::Class5cImpl
: super core::Object::•()
;
}
@#C1
@/* from org-dartlang-testcase:///patch_lib.dart */ #C1
class Class6a<T extends core::Object? = dynamic> extends core::Object {
@#C1
static factory /* from org-dartlang-testcase:///patch_lib.dart */ •<T extends core::Object? = dynamic>((test::Class6a::•::T%) → void f) → test::Class6a<test::Class6a::•::T%> /* redirection-target: test::_Class6aImpl::•<test::Class6a::•::T%>*/
@ -225,13 +225,13 @@ class Class6a<T extends core::Object? = dynamic> extends core::Object {
factory Class6a(void Function(T) f) = _Class6aImpl<T>;
^";
}
@#C1
@/* from org-dartlang-testcase:///patch_lib.dart */ #C1
class Class6b<T extends core::Object? = dynamic> extends core::Object {
@#C1
static factory /* from org-dartlang-testcase:///patch_lib.dart */ •<T extends core::Object? = dynamic>((test::Class6b::•::T%) → void f) → test::Class6b<test::Class6b::•::T%> /* redirection-target: test::_Class6bImpl::•<test::Class6b::•::T%>*/
return new test::_Class6bImpl::•<test::Class6b::•::T%>(f);
}
@#C1
@/* from org-dartlang-testcase:///patch_lib.dart */ #C1
class Class6c<T extends core::Object? = dynamic> extends core::Object {
@#C1
static factory /* from org-dartlang-testcase:///patch_lib.dart */ •<T extends core::Object? = dynamic>((test::Class6c::•::T%) → void f) → test::Class6c<test::Class6c::•::T%> /* redirection-target: test::_Class6cImpl::•<test::Class6c::•::T%>*/

View file

@ -138,8 +138,8 @@ import "dart:core" as core;
import "dart:_internal";
import "dart:_internal";
@#C1
@#C1
@/* from org-dartlang-testcase:///patch_lib1.dart */ #C1
@/* from org-dartlang-testcase:///patch_lib2.dart */ #C1
class Class extends core::Object {
synthetic constructor •() → test::Class
: super core::Object::•()

View file

@ -58,7 +58,7 @@ export "org-dartlang-malformed-uri:?%3Ad";
import "org-dartlang-malformed-uri:?%3Aa";
export "org-dartlang-malformed-uri:?%3Ab";
@#C1
@/* from org-dartlang-testcase:///patch_lib.dart */ #C1
class Class extends core::Object {
synthetic constructor •() → test::Class
: super core::Object::•()

View file

@ -29,7 +29,7 @@ import "dart:_internal";
typedef Alias<T extends core::num> = test::Class<T>;
typedef AliasImpl<T extends core::num> = test::ClassImpl<T>;
@#C13
@/* from org-dartlang-testcase:///patch_lib.dart */ #C13
class Class<T extends core::Object? = dynamic> extends core::Object {
@#C13
constructor •({core::bool defaultValue = #C14, required test::Class::T% value}) → test::Class<test::Class::T%>
@ -46,7 +46,7 @@ class Class<T extends core::Object? = dynamic> extends core::Object {
static factory /* from org-dartlang-testcase:///patch_lib.dart */ redirect2<T extends core::Object? = dynamic>({core::bool defaultValue = #C15, required test::Class::redirect2::T% value}) → test::Class<test::Class::redirect2::T%> /* redirection-target: test::ClassImpl::patched<test::Class::redirect2::T%>*/
return new test::ClassImpl::patched<test::Class::redirect2::T%>(defaultValue: defaultValue, value: value);
}
@#C13
@/* from org-dartlang-testcase:///patch_lib.dart */ #C13
class ClassImpl<T extends core::Object? = dynamic> extends core::Object implements test::Class<test::ClassImpl::T%> {
constructor •({core::bool defaultValue = #C14, required test::ClassImpl::T% value}) → test::ClassImpl<test::ClassImpl::T%>
: super core::Object::•()

View file

@ -12,7 +12,7 @@ import "dart:core" as core;
import "dart:_internal";
@#C1
@/* from org-dartlang-testcase:///patch_lib.dart */ #C1
class Class extends core::Object {
field core::int? _#Class#foo = null /* from org-dartlang-testcase:///patch_lib.dart */;
constructor bar() → self2::Class

View file

@ -12,7 +12,7 @@ import "dart:core" as core;
import "dart:_internal";
@#C1
@/* from org-dartlang-testcase:///patch_lib.dart */ #C1
class Class extends core::Object {
late field core::int foo /* from org-dartlang-testcase:///patch_lib.dart */;
constructor bar() → self2::Class

View file

@ -51,7 +51,7 @@ import "dart:core" as core;
import "dart:_internal";
@#C1
@/* from org-dartlang-testcase:///patch_lib.dart */ #C1
class Class<T extends core::num> extends core::Object /*hasConstConstructor*/ {
final field core::int a;
final field test::Class::T b;

View file

@ -35,7 +35,7 @@ import "dart:core" as core;
import "dart:_internal";
part patch_lib2.dart;
@#C1
@/* from org-dartlang-testcase:///patch_lib2.dart */ #C1
class Class1 extends core::Object {
field core::int _field = null /* from org-dartlang-testcase:///patch_lib2.dart */;
static field core::int _staticField = null /* from org-dartlang-testcase:///patch_lib2.dart */;
@ -43,7 +43,7 @@ class Class1 extends core::Object {
: super core::Object::•()
;
}
@#C1
@/* from org-dartlang-testcase:///patch_lib2.dart */ #C1
class Class2 extends core::Object {
field core::int _field /* from org-dartlang-testcase:///patch_lib2.dart */;
constructor constructor2(core::int _field) → test::Class2

View file

@ -48,7 +48,7 @@ import "dart:core" as core;
import "dart:_internal";
@#C1
@/* from org-dartlang-testcase:///patch_lib.dart */ #C1
class Class extends core::Object {
synthetic constructor •() → test::Class
: super core::Object::•()

View file

@ -104,6 +104,23 @@ class CloneVisitorNotMembers implements TreeVisitor<TreeNode> {
return _activeFileUri == null ? TreeNode.noOffset : fileOffset;
}
bool _assertFileUriTarget(TreeNode node, TreeNode clone) {
if (node is FileUriNode && clone is FileUriNode) {
if (node.fileUri != clone.fileUri) {
assert(
false,
"Original and clone disagrees on file uri: "
"${node.fileUri} vs ${clone.fileUri}");
return false;
}
return true;
} else if (node is! FileUriNode && clone is! FileUriNode) {
return true;
}
assert(false, "Original and clone disagrees on being a file uri node.");
return false;
}
T clone<T extends TreeNode>(T node) {
final Uri? activeFileUriSaved = _activeFileUri;
if (node is FileUriNode) {
@ -111,6 +128,9 @@ class CloneVisitorNotMembers implements TreeVisitor<TreeNode> {
}
final TreeNode result = node.accept(this)
..fileOffset = _cloneFileOffset(node.fileOffset);
assert(_assertFileUriTarget(node, result));
_activeFileUri = activeFileUriSaved;
return result as T;
}
@ -122,7 +142,10 @@ class CloneVisitorNotMembers implements TreeVisitor<TreeNode> {
_activeFileUri = node.fileUri;
}
TreeNode? result = node.accept(this);
if (result != null) result.fileOffset = _cloneFileOffset(node.fileOffset);
if (result != null) {
result.fileOffset = _cloneFileOffset(node.fileOffset);
assert(_assertFileUriTarget(node, result));
}
_activeFileUri = activeFileUriSaved;
return result as T?;
}
@ -386,6 +409,10 @@ class CloneVisitorNotMembers implements TreeVisitor<TreeNode> {
@override
TreeNode visitConstantExpression(ConstantExpression node) {
if (node is FileUriConstantExpression) {
return new FileUriConstantExpression(visitConstant(node.constant),
type: visitType(node.type), fileUri: node.fileUri);
}
return new ConstantExpression(
visitConstant(node.constant), visitType(node.type));
}
@ -1078,6 +1105,8 @@ class CloneVisitorWithMembers extends CloneVisitorNotMembers {
..fileEndOffset = _cloneFileOffset(node.fileEndOffset);
setParents(result.annotations, result);
assert(_assertFileUriTarget(node, result));
_activeFileUri = activeFileUriSaved;
return result;
}
@ -1101,6 +1130,8 @@ class CloneVisitorWithMembers extends CloneVisitorNotMembers {
..flags = node.flags;
setParents(result.annotations, result);
assert(_assertFileUriTarget(node, result));
_activeFileUri = activeFileUriSaved;
return result;
}
@ -1142,6 +1173,8 @@ class CloneVisitorWithMembers extends CloneVisitorNotMembers {
..flags = node.flags;
setParents(result.annotations, result);
assert(_assertFileUriTarget(node, result));
_activeFileUri = activeFileUriSaved;
return result;
}

View file

@ -1458,6 +1458,7 @@ class VerifyingVisitor extends RecursiveResultVisitor<void> {
// TODO(johnniwinther): Merge this with enter/exitParent.
void enterTreeNode(TreeNode node) {
treeNodeStack.add(node);
testLocation(node);
}
/// Invoked by all visit methods if the visited node is a [TreeNode].
@ -1545,6 +1546,34 @@ class VerifyingVisitor extends RecursiveResultVisitor<void> {
return result;
}
// We disable the location test for now, at least these tests currently fail:
// outline/dartdevc/factory_patch/main
// outline/general/constructor_patch/main
// outline/general/factory_patch/main
// outline/general/mixin_from_patch/main
// outline/general/multiple_class_patches/main
// outline/general/patch_extends_implements/main
// outline/nnbd/platform_optional_parameters/main
// pkg/front_end/test/macros/application/macro_application_test.dart -p \
// subtypes.dart
static const bool doTestLocation = false;
void testLocation(TreeNode node) {
if (!doTestLocation) return;
// When these comes from patching (and in the future from augmentation) they
// don't point correctly.
if (node is LibraryDependency || node is LibraryPart) return;
try {
if (node.fileOffset != TreeNode.noOffset) {
node.location;
}
} catch (e) {
problem(
node, "${node.runtimeType} crashes when asked for location: '$e'",
context: node);
}
}
Uri checkLocation(TreeNode node, String? name, Uri fileUri) {
if (name == null || name.contains("#")) {
// TODO(ahe): Investigate if these checks can be enabled:
@ -1562,11 +1591,6 @@ class VerifyingVisitor extends RecursiveResultVisitor<void> {
!target.verification.allowNoFileOffset(stage, node)) {
problem(node, "'$name' has no fileOffset", context: node);
}
try {
node.location;
} catch (e) {
problem(node, "'$name' crashes when asked for location", context: node);
}
return fileUri;
}
}