调用构造函数时出现无法解释的 "CallFailed" 异常
Unexplained "CallFailed" exception when calling constructor function
我有以下方法来标准化 Java M3 节点:
public node normalizeNodeDec(ast) {
return top-down visit (ast) {
case \method(x, _, y, z, q) => \method(Type::short(), "methodName", y, z, q)
case \method(x, _, y, z) => \method(Type::short(), "methodName", y, z)
case \parameter(x, _, z) => \parameter(x, "paramName", z)
case \vararg(x, _) => \vararg(x, "varArgName")
case \annotationTypeMember(x, _) => \annotationTypeMember(x, "annonName")
case \annotationTypeMember(x, _, y) => \annotationTypeMember(x, "annonName", y)
case \typeParameter(_, x) => \typeParameter("typeParaName", x)
case \constructor(_, x, y, z) => \constructor("constructorName", x, y, z)
case \interface(_, x, y, z) => \interface("interfaceName", x, y, z)
case \class(_, x, y, z) => \class("className", x, y, z)
case \enumConstant(_, y) => \enumConstant("enumName", y)
case \enumConstant(_, y, z) => \enumConstant("enumName", y, z)
case \methodCall(x, _, z) => \methodCall(x, "methodCall", z)
case \methodCall(x, y, _, z) => \methodCall(x, y, "methodCall", z)
case Type _ => lang::java::jdt::m3::AST::short()
case Modifier _ => lang::java::jdt::m3::AST::\private()
case \simpleName(_) => \simpleName("simpleName")
case \number(_) => \number("1337")
case \variable(x,y) => \variable("variableName",y)
case \variable(x,y,z) => \variable("variableName",y,z)
case \booleanLiteral(_) => \booleanLiteral(true)
case \stringLiteral(_) => \stringLiteral("StringLiteralThingy")
case \characterLiteral(_) => \characterLiteral("q")
}
但是当我 运行 这段代码时,我得到以下错误:
有谁知道这是什么意思以及我该如何解决这个错误?我知道错误恰好指向行 case \method(x, _, y, z, q) => \method(short(), "methodName", y, z, q)
并且它突出显示 q
.
我在流氓马厩里。
更新:我相应地更改了代码,但这似乎仍然无法解决错误,请参见下文:
更新代码:
public node normalizeNodeDec(ast) {
return top-down visit (ast) {
case \method(x, _, y, z, q) => \method(Type::short(), "methodName", y, z, q)
case \method(x, _, y, z) => \method(Type::short(), "methodName", y, z)
case \parameter(x, _, z) => \parameter(x, "paramName", z)
case \vararg(x, _) => \vararg(x, "varArgName")
case \annotationTypeMember(x, _) => \annotationTypeMember(x, "annonName")
case \annotationTypeMember(x, _, y) => \annotationTypeMember(x, "annonName", y)
case \typeParameter(_, x) => \typeParameter("typeParaName", x)
case \constructor(_, x, y, z) => \constructor("constructorName", x, y, z)
case \interface(_, x, y, z) => \interface("interfaceName", x, y, z)
case \class(_, x, y, z) => \class("className", x, y, z)
case \enumConstant(_, y) => \enumConstant("enumName", y)
case \enumConstant(_, y, z) => \enumConstant("enumName", y, z)
case \methodCall(x, _, z) => \methodCall(x, "methodCall", z)
case \methodCall(x, y, _, z) => \methodCall(x, y, "methodCall", z)
case Type _ => Type::short()
case Modifier _ => Modifier::\private()
case \simpleName(_) => \simpleName("simpleName")
case \number(_) => \number("1337")
case \variable(x,y) => \variable("variableName",y)
case \variable(x,y,z) => \variable("variableName",y,z)
case \booleanLiteral(_) => \booleanLiteral(true)
case \stringLiteral(_) => \stringLiteral("StringLiteralThingy")
case \characterLiteral(_) => \characterLiteral("q")
}
更新错误:
CallFailed
当实际参数类型与函数的形式参数类型不一致时发生。在这种情况下,它是一个构造函数,因此无法应用。
不幸的是,当前稳定版本中没有类型检查器来帮助我们意识到在当前范围内有两个版本的 short()
,其中默默地选择了 "first" 一个!有一个来自 Type
,一个来自 TypeSymbol
。如果它选错了,那么匹配就会失败,因为 Type
和 TypeSymbol
不兼容。
要修复,请使用:Type::short()
for short()
一切都会好起来的。
这适用于代码中所有类型的实例,因此:
case Type _ => lang::java::jdt::m3::AST::short()
应该是 case Type _ => Type::short()
而 case Modifier _ => lang::java::jdt::m3::AST::\private()
应该是 case Modifier _ => Modifier::\private()
我有以下方法来标准化 Java M3 节点:
public node normalizeNodeDec(ast) {
return top-down visit (ast) {
case \method(x, _, y, z, q) => \method(Type::short(), "methodName", y, z, q)
case \method(x, _, y, z) => \method(Type::short(), "methodName", y, z)
case \parameter(x, _, z) => \parameter(x, "paramName", z)
case \vararg(x, _) => \vararg(x, "varArgName")
case \annotationTypeMember(x, _) => \annotationTypeMember(x, "annonName")
case \annotationTypeMember(x, _, y) => \annotationTypeMember(x, "annonName", y)
case \typeParameter(_, x) => \typeParameter("typeParaName", x)
case \constructor(_, x, y, z) => \constructor("constructorName", x, y, z)
case \interface(_, x, y, z) => \interface("interfaceName", x, y, z)
case \class(_, x, y, z) => \class("className", x, y, z)
case \enumConstant(_, y) => \enumConstant("enumName", y)
case \enumConstant(_, y, z) => \enumConstant("enumName", y, z)
case \methodCall(x, _, z) => \methodCall(x, "methodCall", z)
case \methodCall(x, y, _, z) => \methodCall(x, y, "methodCall", z)
case Type _ => lang::java::jdt::m3::AST::short()
case Modifier _ => lang::java::jdt::m3::AST::\private()
case \simpleName(_) => \simpleName("simpleName")
case \number(_) => \number("1337")
case \variable(x,y) => \variable("variableName",y)
case \variable(x,y,z) => \variable("variableName",y,z)
case \booleanLiteral(_) => \booleanLiteral(true)
case \stringLiteral(_) => \stringLiteral("StringLiteralThingy")
case \characterLiteral(_) => \characterLiteral("q")
}
但是当我 运行 这段代码时,我得到以下错误:
有谁知道这是什么意思以及我该如何解决这个错误?我知道错误恰好指向行 case \method(x, _, y, z, q) => \method(short(), "methodName", y, z, q)
并且它突出显示 q
.
我在流氓马厩里。
更新:我相应地更改了代码,但这似乎仍然无法解决错误,请参见下文: 更新代码:
public node normalizeNodeDec(ast) {
return top-down visit (ast) {
case \method(x, _, y, z, q) => \method(Type::short(), "methodName", y, z, q)
case \method(x, _, y, z) => \method(Type::short(), "methodName", y, z)
case \parameter(x, _, z) => \parameter(x, "paramName", z)
case \vararg(x, _) => \vararg(x, "varArgName")
case \annotationTypeMember(x, _) => \annotationTypeMember(x, "annonName")
case \annotationTypeMember(x, _, y) => \annotationTypeMember(x, "annonName", y)
case \typeParameter(_, x) => \typeParameter("typeParaName", x)
case \constructor(_, x, y, z) => \constructor("constructorName", x, y, z)
case \interface(_, x, y, z) => \interface("interfaceName", x, y, z)
case \class(_, x, y, z) => \class("className", x, y, z)
case \enumConstant(_, y) => \enumConstant("enumName", y)
case \enumConstant(_, y, z) => \enumConstant("enumName", y, z)
case \methodCall(x, _, z) => \methodCall(x, "methodCall", z)
case \methodCall(x, y, _, z) => \methodCall(x, y, "methodCall", z)
case Type _ => Type::short()
case Modifier _ => Modifier::\private()
case \simpleName(_) => \simpleName("simpleName")
case \number(_) => \number("1337")
case \variable(x,y) => \variable("variableName",y)
case \variable(x,y,z) => \variable("variableName",y,z)
case \booleanLiteral(_) => \booleanLiteral(true)
case \stringLiteral(_) => \stringLiteral("StringLiteralThingy")
case \characterLiteral(_) => \characterLiteral("q")
}
更新错误:
CallFailed
当实际参数类型与函数的形式参数类型不一致时发生。在这种情况下,它是一个构造函数,因此无法应用。
不幸的是,当前稳定版本中没有类型检查器来帮助我们意识到在当前范围内有两个版本的 short()
,其中默默地选择了 "first" 一个!有一个来自 Type
,一个来自 TypeSymbol
。如果它选错了,那么匹配就会失败,因为 Type
和 TypeSymbol
不兼容。
要修复,请使用:Type::short()
for short()
一切都会好起来的。
这适用于代码中所有类型的实例,因此:
case Type _ => lang::java::jdt::m3::AST::short()
应该是 case Type _ => Type::short()
而 case Modifier _ => lang::java::jdt::m3::AST::\private()
应该是 case Modifier _ => Modifier::\private()