📜  ast querysyntaxexception 未映射 (1)

📅  最后修改于: 2023-12-03 15:13:32.669000             🧑  作者: Mango

Exception: AstQuerySyntaxException 的未映射

在编写和调试程序时,程序员经常面对 AstQuerySyntaxException。该异常通常在尝试使用 AstQuery 时抛出,表示出现了语法错误。

当 AstQuery 无法识别查询时,会抛出该异常。可能是因为查询语法错误、查询表达式格式不正确或查询参数错误等原因。

在解决问题时,我们建议您尝试以下方法:

  1. 检查查询语法 - 确保查询语法符合 AstQuery 查询语法规则。您可以检查查询中的括号、逗号、点、星号和其他符号是否正确使用,并且没有遗漏。
# 示例查询语法
//Find all methods where a string value is being returned
//查询所有返回字符串类型的方法
// - MethodDeclaration 表示方法声明节点
// - any 表示匹配任意类型的节点
// - Selection(Expression) 表示选择返回值节点
// - isType 表示是否符合特定类型
// - StringType 表示字符串类型
// - methodParameters 表示方法的参数节点集合
// - hasDescendant 表示是否有后代节点符合条件
// - Literal 表示字面量
// - isStringLiteral 表示是否是字符串字面量
// - or 表示或者
// - equalsIgnoreCase 表示忽略大小写比较两个字符串是否相等
// - propertyName 表示节点属性名称
// - getValue 表示获取节点属性的值
// - returnStatement 表示返回语句节点
// - isVoidType 表示是否是 Void 类型(Java 中无返回值的方法)
// - isArrayAccess 表示节点访问一个数组元素表达式
MethodDeclaration anyMethod = select("MethodDeclaration").from("File").where(
    any(),
    select().from("methodParameters").where(exists(select().from("VariableDeclarator").where(
            select("Type").from("ArrayAccess").where(
                    select("Target").from("Name").where(equalsIgnoreCase("args")),
                    select("Dimension").from("IntegerLiteral").where(equals(TypeCastMatcher.<IntegerLiteral>getValueMatcher(), "0"))
            ), and(),
            select("Initializer").from("VariableDeclarator").where(equalsNull())
    ))),
    select("Expression").from("ReturnStatement").where(
            select().from("Selection").where(
                    isType("String"),
                    hasDescendant(
                            select().from("Literal").where(
                                    isStringLiteral(), or(),
                                    select().from("Name").where(
                                            equalsIgnoreCase("null")
                                    )
                            )
                    )
            )
    ),
    not(isVoidType())
).getAstNode();
  1. 检查查询表达式 - 如果查询使用表达式,请确保表达式是正确的。如果您使用变量或其他表达式,则必须确保使用正确的语法。
// 示例表达式
// - hasInterface 表示是否实现接口
// - contains 方法接收一个参数,表示包含的元素
// - and,or 表示布尔运算操作符
// - not 表示否定操作符
match.method(hasInterface(Foo.class)
    .and(isPublic())
    .and(not(isStatic())))
    .anyName()
    .withParameterTypes(contains("Class[]"));
  1. 检查查询参数 - 查询参数是您传递给 AstQuery 的参数。如果您的查询依赖于参数,则必须确保这些参数完全符合 AstQuery 的要求。
// 示例参数
CompilationUnit ast = JavaParser.parse(source);
NodeIterator<Node> variables = new NodeIterator<>(ast, VariableDeclarator.class);
NodeIterator<Node> methods = new NodeIterator<>(ast, MethodDeclaration.class);
int count = FormulaNodeIterators.count(variables, methods);
System.out.println("There are " + count + " variables and methods in the source code");

在大多数情况下,通过仔细检查查询语法、查询表达式和查询参数,您将能够成功解决 AstQuerySyntaxException 异常。

上述方法都可以通过为您的查询编写单元测试来自动化测试。自动化测试可确保查询不会破坏系统,并且可以及早发现错误。

希望本文对您有所帮助!