dartdart-analyzer

Find function/method body explicit dependency types using Dart analyzer package


I would like to understand how can I analyze methods / functions body to find types that are explicitly referenced from it. I have success analyzing method declaration (return type, parameter types, etc..), however I have no idea how to do that for body.

Assuming following function:

String someFunction(int param) {
  final list = <String>['a', 'b', 'c'];                     // -> DartTypes: String, List<String>
  final myClass = MyClass<Arg>();                           // -> DartTypes: Arg, MyClass<Arg>
  final functionCall = anotherFunction<FunctionArg<Arg>>(); // -> DartTypes: Arg, FunctionArg<Arg>
  return 'result';
}

// At is point I would like to know that my function depends on
// String, List<String>, Arg, MyClass<Arg>, FunctionArg<Arg>
// in term of DartType instances with proper typeArguments.

I tried getting AstNode for method element described here: https://stackoverflow.com/a/57043177/2033394

However I could not get elements from nodes to figure out their types. Their declaredElement values are always null. So I can not get back to Element API from AST API.


Solution

  • If you've used the exact snippet from the answer you've referenced, the problem is likely in getParsedLibraryByElement(). This method only parses the referenced library - meaning that you'll get an AST that doesn't necessarily have semantic references (like the declaredElement of AST nodes) set.

    Instead, you'll want to use getResolvedLibraryByElement. The AST returned by that method will have its types and references fully resolved.

    With the resolved AST, you could visit the body of the method with a custom visitor to find type references. Your definition of "referenced types" isn't really exact - but perhaps you can collect types in visitNamedType for type references and visitVariableDeclaration to collect the types of variables.