parameter

public void userFunction(
    String input,
    Object... args) {
     // ...
 }

A variable that gets the value of the matching argument used to invoke the method or constructor.

Configuration options

type

Checks the type of the parameter.

search:
  parameter:
    type: "String"
 public void userFunction(
    String input,
    Object... args,
 ) {
     // ...
 }

See also

The examples above use shorthands, see type target for more advanced configurations

annotation

Checks if the parameter has an annotation.

search:
  parameter:
    annotation:
      type: "Deprecated"
 public void userFunction(
    @Deprecated String input,
    Object... args,
 ) {
     // ...
 }

name

Checks the name of the parameter.

search:
  parameter:
    name: "input"
 public void userFunction(
    String input,
    Object... args,
 ) {
     // ...
 }

See also

The examples above use shorthands, see string target for more advanced configurations

modifier

Checks if the parameter has a modifier that matches string target. All modifiers are matched separately. To match multiple modifiers, use allOf or anyOf.

search:
  parameter:
    modifier: "final"
class SomeClass {
    void myMethod(final String s) {
        // ...
    }
}

Generic Configuration options

The following options are generic and available for every target.

anyOf

Similar to the logical operator OR: one or more descendant options should match.

search:
  <target>:
    anyOf:
    - name: "illegal"
    - name: "alsoIllegal"

allOf

Similar to the logical operator AND: all descendant options must match.

search:
  <target>:
    allOf:
    - annotation: "HttpPost"
    - annotation: "AllowUnAuthorized"

with

The only purpose to use this field is to make the recipe easier to read. It provides no additional functionality.

search:
  <target>:
    with:
      annotation: "HttpPost"

not, without

Works as the logical operator NOT. It will negate the result of the descendant options. Sensei presents the user with both options. They display the same behavior, but certain scenarios tend to read better using without.

search:
  <target>:
    not:
      annotation: "HttpPost"
search:
  <target>:
    without:
      annotation: "HttpPost"

in

Performs a structural search, this option is mainly used to narrow down recipes. Examples of this would be to only analyze and mark code inside a certain class or method that has a specific annotation. However, we haven't limited this option to only support these two scenarios. More advanced configuration can be achieved.

search:
  <target>:
    in:
      class:
        name:
          contains: "Controller"
search:
  <target>:
    in:
      method:
        annotation:
          type: "HttpPost"