2016-09-20 5 views
1

さらに複雑な解析用のパッチについては、Sensorの実装クラスと次の行番号のバインディングに情報を収集する必要があります。sonarqubeプラグインのツリー構築中にノード訪問者の回線番号を取得する方法

ツリー要素の行番号はどこにありますか?

java.plugin.version:3.13.1 sonar.plugin.api.version:5.2

は、新しいバージョンがより機能していることができますか?

私たちのゴール - いくつかの命名規則の詳細を含むパッケージ名とクラス名を確認するには、いくつかのパッケージをインポートしないでください。

ノードの訪問者から、すべてのツリーノードを見ることができないことは明らかです。 しかし、ここでは、addIssue()の内部メカニズムによって、ノード固有のコード場所の問題を登録できます。

/** 
* First step implementation of node visitor for complex multinode check 
*/ 
@Rule(key = "ImportClassCheck", 
    name = "Import classes should not contain web or form", 
    description = "Import classes should not contain web or form", 
    priority = Priority.CRITICAL, 
    tags = {"bug" }) 

public class ImportClassCheck extends IssuableSubscriptionVisitor { 

@Override 
public List<Kind> nodesToVisit() { 
    return ImmutableList.of(Tree.Kind.IMPORT, Tree.Kind.PACKAGE, Tree.Kind.CLASS); 
} 

@Override 
public void visitNode(Tree tree) { 
    if (JavaCodeSensor.packages.get(context.getFileKey()) == null) { 
     JavaCodeSensor.packages.put(context.getFileKey(), new ImportClassCheckState()); 
     JavaCodeSensor.packages.get(context.getFileKey()).file = context.getFile(); 
    } 

    if (tree.is(Kind.PACKAGE)) 
     JavaCodeSensor.packages.get(context.getFileKey()).packageTree = (PackageDeclarationTree) tree; 

    if (tree.is(Kind.CLASS)) 
      JavaCodeSensor.packages.get(context.getFileKey()).classTree.add((ClassTree) tree); 

    if (tree.is(Kind.IMPORT)) 
     JavaCodeSensor.packages.get(context.getFileKey()).importTree.add((ImportTree) tree); 
} 
} 

その後、我々は(分析のインタフェースの実装をSensorを来る) - おっと、ここではクラス名の問題を登録するコードの行についての情報は、ファイルの構文解析せずに、クラス宣言のラインで、たとえば、ではありません再び。

/** 
* First step to register an Issue 
*/ 
@Override 
public void analyse(Project project, SensorContext sensorContext) { 
    for (Entry<String, ImportClassCheckState> entry : packages.entrySet()) { 
     if (entry.getValue().isRuleFails()) { 
      NewIssue newIssue = sensorContext.newIssue().forRule(
           RuleKey.of("java-custom-rules-template", "ImportClassCheck")); 
      newIssue.at(newIssue.newLocation() 
        .on(filesystem 
          .inputFile(filesystem.predicates().is(entry.getValue().file))) 
/* Here is a problem to identify code of line, but needed tree nodes are exists in 
ImportClassCheckState members*/ 
          .at(new DefaultTextRange(new DefaultTextPointer(1, 0), 
         new DefaultTextPointer(1, 0)))); 
      newIssue.save(); 

      logger.info("Issue registered for file " + entry.getValue().file.getName()); 
     } 
    } 
} 
+0

この質問には、あまりにも多くの情報がありません。どのSonarQubeプラグインについてお話していますか?このSQプラグインのどのバージョンですか?あなたがカバーしたいユースケースをより正確に表現できますか?ありがとう –

+0

質問の目標を追加 –

答えて

4

あなたの質問に答える複数の方法。

最初に言い換えると、ツリーのノードから回線情報にアクセスする方法です。

最新のバージョン(4.2)にアップグレードし、ツリーの各ノードで利用可能なfirstSyntaxToken().line()メソッドを使用してください。

しかし、これをまったく必要としないのは、issuableSubscriptionVisitor(addIssueまたはreportIssueのいずれか)で使用可能なメソッドを使用して問題を報告し、センサー内で問題を発生させないことです。

+0

ありがとう!私は最新の機能を使用しようとします。 –

+0

あなたはノードの順序に応じて、顧客が要件を公開しているため、このメソッドを使用する方が適しています。 –

関連する問題