#extract #name #statement #def #analysis #python #declaration

aws-fully-qualified-names

用于从代码中提取def使用语句

6个稳定版本

2.1.4 2024年2月23日
2.1.3 2024年2月19日
2.1.2 2023年3月23日
2.1.0 2023年2月28日

#96 in WebAssembly

Apache-2.0

525KB
13K SLoC

全限定名称

一个名称不能通过定义进一步分解:它是一个原始符号 — 路德维希·维特根斯坦

tree-sitter 驱动,fully-qualified-names 允许您从用JavaScript、TypeScript、Python或Java编写的代码中提取简单和全限定名称。这些名称进一步分为声明和用法,这为静态分析提供了对更复杂AST的方便简化。

如何使用

该软件包提供Rust和基于WASM的JS API。要在Rust中从Python代码片段中获取名称,您可以使用以下类似的方法。

use fully-qualified-names::Python;

let code = r#"class Person:
  def __init__(self, name):
    self.name = name

  def hello(self):
    return f"Hello, {self.name}"
"#;

let names = Python::find_names(code).unwrap();
println!("{names:?}");

在JS中,它会看起来像这样。

import { Python } from '@aws/fully-qualified-names';

const code = `class Person:
  def __init__(self, name):
    self.name = name

  def hello(self):
    return f"Hello, {self.name}"
`;

const names = await Python.findNames(code);
console.log(JSON.stringify(names));

背景

在编程中,标识符用于引用值、类型和代码段。

名称

它们都有简单的名称,这些名称是上下文特定的,以及全限定名称(以下简称FQN),这些名称在项目间是无歧义且唯一的。

例如,以下Rust代码片段。

let list = std::vec::Vec::new();

这里我们有几个简单的名称(liststdvecVecnew),包括变量(list)、模块(stdvec)、类型(Vec)和方法(new)名称。

所有这些都有FQN,new方法的FQN明确表示为std::vec::Vec::new,而list变量的FQN只能通过了解周围包和模块结构来确定。

声明 -- 用法

上面引入的名称可以进一步分为声明(list)和用法(std::vec::Vec::new

声明:声明是一种语句,它将名称引入一个作用域。

值使用:在需要评估(即查找)符号定义的表达式中使用符号名。

类型使用:类型名由编译器在左侧上下文中使用,以

  • 确保右侧上下文中的值具有所需类型
  • 避免类型在作用域之间传播/推断

安全

有关更多信息,请参阅CONTRIBUTING

许可证

本项目采用Apache-2.0许可证。

依赖项

~4-15MB
~381K SLoC