TreeUtils { public static String nameFromExpression(Expression expression) { if (expression.is(Tree.Kind.NAME)) { return ((Name) expression).name(); } return null; } private  TreeUtils(); @CheckForNull static Tree firstAncestor(Tree tree, Predicate<Tree> predicate); @CheckForNull static Tree firstAncestorOfKind(Tree tree, Kind... kinds); static List<Token> tokens(Tree tree); static List<Token> nonWhitespaceTokens(Tree tree); static boolean hasDescendant(Tree tree, Predicate<Tree> predicate); static Stream<Expression> flattenTuples(Expression expression); static Optional<Symbol> getSymbolFromTree(@Nullable Tree tree); @CheckForNull static ClassSymbol getClassSymbolFromDef(@Nullable ClassDef classDef); @CheckForNull static FunctionSymbol getFunctionSymbolFromDef(@Nullable FunctionDef functionDef); static List<Parameter> nonTupleParameters(FunctionDef functionDef); static List<Parameter> positionalParameters(FunctionDef functionDef); static List<FunctionDef> topLevelFunctionDefs(ClassDef classDef); @CheckForNull static RegularArgument argumentByKeyword(String keyword, List<Argument> arguments); @CheckForNull static RegularArgument nthArgumentOrKeyword(int argPosition, String keyword, List<Argument> arguments); static boolean isBooleanLiteral(Tree tree); static String nameFromExpression(Expression expression); @CheckForNull static LocationInFile locationInFile(Tree tree, @Nullable String fileId);  }
@Test public void test_nameFromExpression() { assertThat(TreeUtils.nameFromExpression(lastExpression("my_var"))).isEqualTo("my_var"); assertThat(TreeUtils.nameFromExpression(lastExpression("self.my_var"))).isNullOrEmpty(); assertThat(TreeUtils.nameFromExpression(lastExpression("my_call()"))).isNullOrEmpty(); assertThat(TreeUtils.nameFromExpression(lastExpression("a == b"))).isNullOrEmpty(); }