openrewrite / rewrite-analysis

OpenRewrite recipes for data flow analysis.
Apache License 2.0
8 stars 8 forks source link

`VarAccess`: Support lambda parameters #38

Open knutwannheden opened 9 months ago

knutwannheden commented 9 months ago

Currently, a VarAccessTest test case like the following fails:

    @Test
    void lambdaParameter() {
        rewriteRun(
          java(
            """
              interface Fun {
                  String message(String s);
              }

              class Test {
                  void test() {
                      Fun foobar = (s) -> s;
                  }
              }
              """,
            """
              interface Fun {
                  String message(String s);
              }

              class Test {
                  void test() {
                      Fun foobar = (s) -> /*~~>*/s;
                  }
              }
              """
          )
        );
    }

The Parameter trait does not yet support lambdas. From the docs I tried to understand how CodeQL models lambdas. It looks like a lambda is somehow a wrapper around a Method and thus somehow resembles the Java runtime view of a lambda. The lambda's parameters are then declared on this method.

I don't remember / understand CodeQL well enough to see how we should translate this into the traits we have. Intuitively I would otherwise have made the LambdaExpr trait extend Callable. But that would be a deviation of CodeQL.

@JLLeitschuh Can you provide some guidance here?

JLLeitschuh commented 9 months ago

This is one of those problems I realized was more complex than I could solve with the time I had.

I want to model this right, but, off hand, I don't have any answers here right now.

What I really need to do is sit down and write some test CodeQL queries and attempt to model lambdas and see what API's return what. That way I can verify that what we do for this API matches