Flutter 获取未定义的超级类型或与源\u gen的接口的名称

Flutter 获取未定义的超级类型或与源\u gen的接口的名称,flutter,code-generation,Flutter,Code Generation,我正在处理一个生成器包,希望访问定义为超级约束的类名。当第一次构建时,它将不存在,所以我猜source\u gen只是将其从分析中排除 例如,考虑到我需要用户定义 @防火 类用户扩展$User{ 最终用户库数据; 使用者({ 需要这个数据, 所需的文档快照, }):超级(快照); 工厂用户.fromSnapshot(DocumentSnapshot快照)=> _$UserFromSnapshot(快照); } 如何获取尚未定义的类的名称?我希望是动态的,所以即使用户决定给它取个别的名字,我也能

我正在处理一个生成器包,希望访问定义为超级约束的类名。当第一次构建时,它将不存在,所以我猜
source\u gen
只是将其从分析中排除

例如,考虑到我需要用户定义

@防火
类用户扩展$User{
最终用户库数据;
使用者({
需要这个数据,
所需的文档快照,
}):超级(快照);
工厂用户.fromSnapshot(DocumentSnapshot快照)=>
_$UserFromSnapshot(快照);
}
如何获取尚未定义的类的名称?我希望是动态的,所以即使用户决定给它取个别的名字,我也能适应这个名字

我尝试了元素上的大多数字段,但找不到任何可以提供该元素的字段:

@覆盖
未注元素的未来生成器(
元素元素,
康斯坦德雷德尔注释,
BuildStep BuildStep,
)异步的{
最终类元素=元素作为类元素;
classElement.supertype;//对象
classElement.displayName;//类用户
//我想要u$User
}

也许答案涉及到获取ast,但我在这方面没有太多的经验。

我四处摸索
冻结了
,我发现了一个帮助函数,可以让您获取元素的ast节点

Future tryGetastNodeForRelation(
元素元素,
BuildStep BuildStep,
)异步的{
var library=element.library!;
while(true){
试一试{
return library.session
.getParsedLibraryByElement(库)
.getElementDeclaration(元素)!
.节点;
}论不一致性性别观念{
库=等待buildStep.resolver.libraryFor(
等待buildStep.resolver.assetidforement(element.library!),
);
}
}
}
使用该函数,您可以创建ast节点,然后可以遍历其子节点以查找所需的模式。在冻结的
中,它是这样的

令牌?equalToken=ast.endToken;
while(true){
如果(equalToken==null||
equalToken.charOffset')返回null;
如果(equalToken.stringValue=='='='){
打破
}
equalToken=equalToken.previous;
}
因此,他们向后遍历令牌,直到发现该令牌等于他们想要的令牌(然后使用该令牌获得重定向构造函数)

在我的例子中,我只需要查找类型的结束和开始,并将内部类型存储为字符串。AST不忽略未定义的标记


所有的功劳都归于Rémi Rousselet和他的软件包

如果您正在寻找StringToken,请确保使用
.lexeme
而不是
.stringValue