parent
46fff96588
commit
99c612378d
@ -0,0 +1,112 @@ |
|||||||
|
/* |
||||||
|
* Copyright (c) 2023 - 2024. KeyWare.Co.Ltd All rights reserved. |
||||||
|
* 项目名称:C++ 信息安全性设计准则 |
||||||
|
* 项目描述:用于检查C++源代码的安全性设计准则的Sonarqube插件 |
||||||
|
* 版权说明:本软件属北京关键科技股份有限公司所有,在未获得北京关键科技股份有限公司正式授权情况下,任何企业和个人,不能获取、阅读、安装、传播本软件涉及的任何受知识产权保护的内容。 |
||||||
|
*/ |
||||||
|
package com.keyware.sonar.cxx; |
||||||
|
|
||||||
|
import com.sonar.cxx.sslr.api.AstNode; |
||||||
|
import com.sonar.cxx.sslr.api.AstNodeType; |
||||||
|
import com.sonar.cxx.sslr.api.Grammar; |
||||||
|
import org.sonar.cxx.squidbridge.checks.SquidCheck; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
/** |
||||||
|
* 可自由订阅的语法树节点访问器 |
||||||
|
* |
||||||
|
* @author GuoXin |
||||||
|
* @date 2024/1/13 |
||||||
|
*/ |
||||||
|
public abstract class SubscriptionAstVisitor extends SquidCheck<Grammar> { |
||||||
|
/** |
||||||
|
* 构造函数需要传入初代访问器 |
||||||
|
* |
||||||
|
* @param checker 初代规则检查器 |
||||||
|
*/ |
||||||
|
public SubscriptionAstVisitor(SquidCheck<Grammar> checker) { |
||||||
|
setContext(checker.getContext()); |
||||||
|
visitNodeTypes().forEach(this::subscribeTo); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 对指定的节点进行访问操作 |
||||||
|
* |
||||||
|
* @param node 需要访问的节点 |
||||||
|
*/ |
||||||
|
public void accept(AstNode node) { |
||||||
|
this.visit(node); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 获取该访问器所需要访问的节点类型列表 |
||||||
|
* |
||||||
|
* @return 节点类型列表 |
||||||
|
*/ |
||||||
|
public abstract List<AstNodeType> visitNodeTypes(); |
||||||
|
|
||||||
|
/** |
||||||
|
* 对指定的节点进行访问 |
||||||
|
* |
||||||
|
* @param node 待访问的节点 |
||||||
|
*/ |
||||||
|
private void visit(AstNode node) { |
||||||
|
boolean isSubscribed = isSubscribed(node); |
||||||
|
if (isSubscribed) { |
||||||
|
visitNode(node); |
||||||
|
} |
||||||
|
visitChildren(node); |
||||||
|
if (isSubscribed) { |
||||||
|
leaveNode(node); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 对指定节点的子节点进行访问 |
||||||
|
* |
||||||
|
* @param node 待访问的节点 |
||||||
|
*/ |
||||||
|
private void visitChildren(AstNode node) { |
||||||
|
if (node.hasChildren()) { |
||||||
|
for (AstNode next : node.getChildren()) { |
||||||
|
if (next != null) { |
||||||
|
visit(next); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 判断指定节点是否被订阅 |
||||||
|
* |
||||||
|
* @param tree 待判断的节点 |
||||||
|
* @return true表示被订阅,false表示未订阅 |
||||||
|
*/ |
||||||
|
private boolean isSubscribed(AstNode tree) { |
||||||
|
return getAstNodeTypesToVisit().contains(tree.getType()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 创建由给定 AST 节点导致的文件级问题 |
||||||
|
* |
||||||
|
* @param message 描述违规的消息,可以格式化(参见 java.text.MessageFormat) |
||||||
|
* @param messageParameters 可选消息参数(请参阅 java.text.MessageFormat) |
||||||
|
*/ |
||||||
|
protected void reportIssue(String message, Object... messageParameters) { |
||||||
|
getContext().createFileViolation(this, message, messageParameters); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 创建由给定 AST 节点导致的行级问题 |
||||||
|
* |
||||||
|
* @param node 导致问题的 AST 节点 |
||||||
|
* @param message 描述违规的消息,可以格式化(参见 java.text.MessageFormat) |
||||||
|
* @param messageParameters 可选消息参数(请参阅 java.text.MessageFormat) |
||||||
|
*/ |
||||||
|
protected void reportIssue(AstNode node, String message, Object... messageParameters) { |
||||||
|
getContext().createLineViolation(this, message, node, messageParameters); |
||||||
|
} |
||||||
|
} |
||||||
|
|
Loading…
Reference in new issue