私はSonarqube〜5.4用のカスタムルールプラグインを作成しようとしていますが、いくつかのルールを実装して動作させている間に、標準ライブラリ以外のタイプに依存するルールは様々なアクロバットな文字列マッチングに依存しています。カスタムソナープラグインルールで正しいバイトコードを使用できるようにするにはどうすればいいのですか?あらゆる種類の?
私は、包装を行うにはsonar-packaging-maven-plugin
を使用しています:
<plugin>
<groupId>org.sonarsource.sonar-packaging-maven-plugin</groupId>
<artifactId>sonar-packaging-maven-plugin</artifactId>
<version>1.16</version>
<configuration>
<pluginClass>${project.groupId}.sonar.BravuraRulesPlugin</pluginClass>
<pluginKey>SonarPluginBravura</pluginKey>
<skipDependenciesPackaging>false</skipDependenciesPackaging>
<basePlugin>java</basePlugin>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>sonar-plugin</goal>
</goals>
</execution>
</executions>
</plugin>
そして、次のヘルパー拡張(kotlin)を使用して、さまざまなチェックを実行しています:
fun <T : JavaFileScanner> T.verify() {
val workDir = System.getProperty("user.dir");
val folder = Paths.get(workDir, "src/test/samples", this.javaClass.simpleName);
Files.list(folder).forEach { sample ->
try {
if (sample.toString().endsWith(".clean.java")) {
JavaCheckVerifier.verifyNoIssue(sample.toString(), this);
} else {
JavaCheckVerifier.verify(sample.toString(), this);
}
} catch (error: Exception) {
throw VerificationFailedException(sample, error);
}
}
};
class VerificationFailedException(path: Path, error: Exception)
: Exception("Failed to verify $path.", error);
私はIssuableSubscriptionVisitor
サブクラスを作成ルールTree.Kind.METHOD_INVOCATION
を参照し、静的なMAX、MIN、ASC、またはDESCのSQLビルダーメソッドを使用して、AutoLongColumn
を探してください。これは、注文目的で使用されている識別子フィールドを停止するためです。
残念ながら、maven 'test'クラスパスに必要なライブラリがありますが、タイプを取得しようとすると、それらは単に!unknown!
と表示されます。
override fun visitNode(tree: Tree) {
if (tree !is MethodInvocationTree) {
return;
}
val methodSelect = tree.methodSelect();
if (methodSelect !is IdentifierTree || methodSelect.name() !in setOf("MAX", "MIN", "ASC", "DESC")) {
return;
}
val firstArg = statement.arguments().first();
if (firstArg !is MethodInvocationTree) {
return;
}
val firstArgSelect = firstArg.methodSelect();
if (firstArgSelect !is MemberSelectExpressionTree) {
return;
}
if (firstArgSelect.type is UnknownType) {
throw TableFlipException("(ノಥ益ಥ)ノ ┻━┻");
}
// It never gets here.
}
は、私は、パズルのいくつかの重要な部分が欠けてると確信している、と私は間違っているつもりだどこ誰かが私に言うことができる場合、私は感謝します。
EDIT:私はアナライザ用org.sonarsource.java:sonar-java-plugin:3.14
を使用している、と私は分析対象(商用IPおよびすべてのこと)のためにすべてのコードをリリースすることはできませんが、ここで重要な部分と構造的に同一のものがあります:
import static com.library.UtilClass.MAX;
...
query.SELECT(biggestId = MAX(address._id())) // Noncompliant
.FROM(address)
.WHERE(address.user_id().EQ(userId)
.AND(address.type_id().EQ(typeId)));
...
address.id()
のタイプは、長時間を囲むcom.library.Identifier
です。私はすべてのメソッド呼び出しを訪問し、com.library.UtilCLass.MAX
と一致するかどうか確認したい場合は、最初のパラメータがcom.library.Identifier
でないことを確認してください。型情報がなければ、_id
メソッド参照に正規表現マッチを行わなければならない可能性があります。
分析するコードを共有してもよろしいですか?そこに何かが隠されているかもしれません。 – benzonico
また、あなたが使用しているソナーのJavaアナライザのバージョンを正確に知りたいかもしれません。 – benzonico
質問に更新を追加しました。 – tzrlk