Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

what can get_cross_file_context() and get_cross_file_definition_by_line() do? #30

Open
CZH-THU opened this issue Jan 7, 2025 · 12 comments

Comments

@CZH-THU
Copy link

CZH-THU commented Jan 7, 2025

当我使用tree-sitter 解析java代码库后,使用get_cross_file_context() and get_cross_file_definition_by_line() 去召回特定节点的跨文件节点信息时,总得到[],图谱中显示该特定节点既有出度也有入度。

@FunJim
Copy link
Collaborator

FunJim commented Jan 14, 2025

能具体附上这个DependencyGraph的JSON格式数据吗?这个节点是否与本仓库内其它文件的节点有依赖关系?

@CZH-THU
Copy link
Author

CZH-THU commented Jan 15, 2025

能具体附上这个DependencyGraph的JSON格式数据吗?这个节点是否与本仓库内其它文件的节点有依赖关系?

抱歉,仓库由于信息安全不能附上,不过我可以举一个python的例子:
image
image
image
这个仓库只有两个py文件,它们有互相调用在对方脚本中定义的类,但是get_cross_file_definition_by_line()得不到任何东西,如标题所说我没搞明白get_cross_file_context() and get_cross_file_definition_by_line()的具体作用

@FunJim
Copy link
Collaborator

FunJim commented Jan 15, 2025

能具体附上这个DependencyGraph的JSON格式数据吗?这个节点是否与本仓库内其它文件的节点有依赖关系?

抱歉,仓库由于信息安全不能附上,不过我可以举一个python的例子: image image image 这个仓库只有两个py文件,它们有互相调用在对方脚本中定义的类,但是get_cross_file_definition_by_line()得不到任何东西,如标题所说我没搞明白get_cross_file_context() and get_cross_file_definition_by_line()的具体作用

get_cross_file_definition_by_line的功能是从指定文件的某一特定行开始,查找并提取所有与此行所在的最里层节点(类/函数级别)相关的跨文件关系。包括继承、调用、实例化等关系。你可以结合这里的单测来配合理解:https://github.com/codefuse-ai/RepoFuse/blob/main/repo_specific_semantic_graph/tests/test_retriever.py#L149

比如里面提到的第一个测试用例:

cross_file_edge_list = sample_retriever.get_cross_file_definition_by_line(
        python_repo_suite_path / "cross_file_context" / "main.py", 18
    )

    assert len(cross_file_edge_list) == 4
    context = [
        (
            edge[0].name,
            edge[2].relation.name,
            edge[1].type.value,
            edge[1].name,
            edge[1].location.file_path.name,
        )
        for edge in cross_file_edge_list
    ]

    assert context == unordered(
        [
            ("Foo.call", "Instantiates", "class", "Bar", "b.py"),
            ("Foo.call", "Calls", "function", "bar", "b.py"),
            ("main", "Imports", "class", "Bar", "b.py"),
            ("main", "Imports", "function", "bar", "b.py"),
        ]
    )

https://github.com/codefuse-ai/RepoFuse/blob/main/repo_specific_semantic_graph/tests/code_example/python/cross_file_context/main.py#L18 这一行可以召回对b.py的一些依赖关系。

你可以检查下你想要召回的那一行代码所在最里层节点是否有这样的跨文件关系。

@CZH-THU
Copy link
Author

CZH-THU commented Jan 16, 2025

能具体附上这个DependencyGraph的JSON格式数据吗?这个节点是否与本仓库内其它文件的节点有依赖关系?

抱歉,仓库由于信息安全不能附上,不过我可以举一个python的例子: image image image 这个仓库只有两个py文件,它们有互相调用在对方脚本中定义的类,但是get_cross_file_definition_by_line()得不到任何东西,如标题所说我没搞明白get_cross_file_context() and get_cross_file_definition_by_line()的具体作用

get_cross_file_definition_by_line的功能是从指定文件的某一特定行开始,查找并提取所有与此行所在的最里层节点(类/函数级别)相关的跨文件关系。包括继承、调用、实例化等关系。你可以结合这里的单测来配合理解:https://github.com/codefuse-ai/RepoFuse/blob/main/repo_specific_semantic_graph/tests/test_retriever.py#L149

比如里面提到的第一个测试用例:

cross_file_edge_list = sample_retriever.get_cross_file_definition_by_line(
        python_repo_suite_path / "cross_file_context" / "main.py", 18
    )

    assert len(cross_file_edge_list) == 4
    context = [
        (
            edge[0].name,
            edge[2].relation.name,
            edge[1].type.value,
            edge[1].name,
            edge[1].location.file_path.name,
        )
        for edge in cross_file_edge_list
    ]

    assert context == unordered(
        [
            ("Foo.call", "Instantiates", "class", "Bar", "b.py"),
            ("Foo.call", "Calls", "function", "bar", "b.py"),
            ("main", "Imports", "class", "Bar", "b.py"),
            ("main", "Imports", "function", "bar", "b.py"),
        ]
    )

https://github.com/codefuse-ai/RepoFuse/blob/main/repo_specific_semantic_graph/tests/code_example/python/cross_file_context/main.py#L18 这一行可以召回对b.py的一些依赖关系。

你可以检查下你想要召回的那一行代码所在最里层节点是否有这样的跨文件关系。

感谢,我还有一点不明白,什么是"此行所在的最里层节点",https://github.com/codefuse-ai/RepoFuse/blob/main/repo_specific_semantic_graph/tests/code_example/python/cross_file_context/main.py#L18 是一个print语句,为什么能召回15行和16行的依赖,当start_line=16时,却只能召回15行的依赖,这里是召回call()函数中start_line之前的跨文件依赖么?还是什么其他的,能再具体说一下start_line参数的意义么。

@FunJim
Copy link
Collaborator

FunJim commented Jan 16, 2025

能具体附上这个DependencyGraph的JSON格式数据吗?这个节点是否与本仓库内其它文件的节点有依赖关系?

抱歉,仓库由于信息安全不能附上,不过我可以举一个python的例子: image image image 这个仓库只有两个py文件,它们有互相调用在对方脚本中定义的类,但是get_cross_file_definition_by_line()得不到任何东西,如标题所说我没搞明白get_cross_file_context() and get_cross_file_definition_by_line()的具体作用

get_cross_file_definition_by_line的功能是从指定文件的某一特定行开始,查找并提取所有与此行所在的最里层节点(类/函数级别)相关的跨文件关系。包括继承、调用、实例化等关系。你可以结合这里的单测来配合理解:https://github.com/codefuse-ai/RepoFuse/blob/main/repo_specific_semantic_graph/tests/test_retriever.py#L149
比如里面提到的第一个测试用例:

cross_file_edge_list = sample_retriever.get_cross_file_definition_by_line(
        python_repo_suite_path / "cross_file_context" / "main.py", 18
    )

    assert len(cross_file_edge_list) == 4
    context = [
        (
            edge[0].name,
            edge[2].relation.name,
            edge[1].type.value,
            edge[1].name,
            edge[1].location.file_path.name,
        )
        for edge in cross_file_edge_list
    ]

    assert context == unordered(
        [
            ("Foo.call", "Instantiates", "class", "Bar", "b.py"),
            ("Foo.call", "Calls", "function", "bar", "b.py"),
            ("main", "Imports", "class", "Bar", "b.py"),
            ("main", "Imports", "function", "bar", "b.py"),
        ]
    )

https://github.com/codefuse-ai/RepoFuse/blob/main/repo_specific_semantic_graph/tests/code_example/python/cross_file_context/main.py#L18 这一行可以召回对b.py的一些依赖关系。
你可以检查下你想要召回的那一行代码所在最里层节点是否有这样的跨文件关系。

感谢,我还有一点不明白,什么是"此行所在的最里层节点",https://github.com/codefuse-ai/RepoFuse/blob/main/repo_specific_semantic_graph/tests/code_example/python/cross_file_context/main.py#L18 是一个print语句,为什么能召回15行和16行的依赖,当start_line=16时,却只能召回15行的依赖,这里是召回call()函数中start_line之前的跨文件依赖么?还是什么其他的,能再具体说一下start_line参数的意义么。

get_cross_file_definition_by_line还会根据start_line来筛选出依赖边位置的行号 < start_line 的,以此保证返回的依赖关系发生在start_line之前。筛选逻辑可以见这里:https://github.com/codefuse-ai/RepoFuse/blob/main/repo_specific_semantic_graph/dependency_graph/dependency_graph.py#L336-L346

这就是为什么第15、16、18行最里层节点都为Foo.call,但是会召回不同的跨文件依赖。

@CZH-THU
Copy link
Author

CZH-THU commented Jan 16, 2025

能具体附上这个DependencyGraph的JSON格式数据吗?这个节点是否与本仓库内其它文件的节点有依赖关系?

抱歉,仓库由于信息安全不能附上,不过我可以举一个python的例子: image image image 这个仓库只有两个py文件,它们有互相调用在对方脚本中定义的类,但是get_cross_file_definition_by_line()得不到任何东西,如标题所说我没搞明白get_cross_file_context() and get_cross_file_definition_by_line()的具体作用

get_cross_file_definition_by_line的功能是从指定文件的某一特定行开始,查找并提取所有与此行所在的最里层节点(类/函数级别)相关的跨文件关系。包括继承、调用、实例化等关系。你可以结合这里的单测来配合理解:https://github.com/codefuse-ai/RepoFuse/blob/main/repo_specific_semantic_graph/tests/test_retriever.py#L149
比如里面提到的第一个测试用例:

cross_file_edge_list = sample_retriever.get_cross_file_definition_by_line(
        python_repo_suite_path / "cross_file_context" / "main.py", 18
    )

    assert len(cross_file_edge_list) == 4
    context = [
        (
            edge[0].name,
            edge[2].relation.name,
            edge[1].type.value,
            edge[1].name,
            edge[1].location.file_path.name,
        )
        for edge in cross_file_edge_list
    ]

    assert context == unordered(
        [
            ("Foo.call", "Instantiates", "class", "Bar", "b.py"),
            ("Foo.call", "Calls", "function", "bar", "b.py"),
            ("main", "Imports", "class", "Bar", "b.py"),
            ("main", "Imports", "function", "bar", "b.py"),
        ]
    )

https://github.com/codefuse-ai/RepoFuse/blob/main/repo_specific_semantic_graph/tests/code_example/python/cross_file_context/main.py#L18 这一行可以召回对b.py的一些依赖关系。
你可以检查下你想要召回的那一行代码所在最里层节点是否有这样的跨文件关系。

感谢,我还有一点不明白,什么是"此行所在的最里层节点",https://github.com/codefuse-ai/RepoFuse/blob/main/repo_specific_semantic_graph/tests/code_example/python/cross_file_context/main.py#L18 是一个print语句,为什么能召回15行和16行的依赖,当start_line=16时,却只能召回15行的依赖,这里是召回call()函数中start_line之前的跨文件依赖么?还是什么其他的,能再具体说一下start_line参数的意义么。

get_cross_file_definition_by_line还会根据start_line来筛选出依赖边位置的行号 < start_line 的,以此保证返回的依赖关系发生在start_line之前。筛选逻辑可以见这里:https://github.com/codefuse-ai/RepoFuse/blob/main/repo_specific_semantic_graph/dependency_graph/dependency_graph.py#L336-L346

这就是为什么第15、16、18行最里层节点都为Foo.call,但是会召回不同的跨文件依赖。
好的,明白了。还有个问题:

https://github.com/codefuse-ai/RepoFuse/blob/main/repo_specific_semantic_graph/dependency_graph/dependency_graph.py#L316-L321

我理解module_node至少有一个元素即file_path所在脚本,但当file_path="***/repo_specific_semantic_graph/tests/code_example/python/cross_file_context/main.py"时确为空list,这是为什么

@FunJim
Copy link
Collaborator

FunJim commented Jan 16, 2025

https://github.com/codefuse-ai/RepoFuse/blob/main/repo_specific_semantic_graph/dependency_graph/dependency_graph.py#L316-L321

我理解module_node至少有一个元素即file_path所在脚本,但当file_path="***/repo_specific_semantic_graph/tests/code_example/python/cross_file_context/main.py"时确为空list,这是为什么

没有太明白这个问题,是什么情况下module_node为空呢?

@CZH-THU
Copy link
Author

CZH-THU commented Jan 16, 2025

https://github.com/codefuse-ai/RepoFuse/blob/main/repo_specific_semantic_graph/dependency_graph/dependency_graph.py#L316-L321
我理解module_node至少有一个元素即file_path所在脚本,但当file_path="***/repo_specific_semantic_graph/tests/code_example/python/cross_file_context/main.py"时确为空list,这是为什么

没有太明白这个问题,是什么情况下module_node为空呢?

利用您提供的测试用例:cross_file_edge_list = sample_retriever.get_cross_file_definition_by_line(
python_repo_suite_path / "cross_file_context" / "main.py", 18
)
的时候module_node为空

@FunJim
Copy link
Collaborator

FunJim commented Jan 16, 2025

https://github.com/codefuse-ai/RepoFuse/blob/main/repo_specific_semantic_graph/dependency_graph/dependency_graph.py#L316-L321
我理解module_node至少有一个元素即file_path所在脚本,但当file_path="***/repo_specific_semantic_graph/tests/code_example/python/cross_file_context/main.py"时确为空list,这是为什么

没有太明白这个问题,是什么情况下module_node为空呢?

利用您提供的测试用例:cross_file_edge_list = sample_retriever.get_cross_file_definition_by_line( python_repo_suite_path / "cross_file_context" / "main.py", 18 ) 的时候module_node为空

可以检查下pytest运行的当前目录是否在repo_specific_semantic_graph/tests下,因为需要pytest读取repo_specific_semantic_graph/tests/conftest.py里面注入的python_repo_suite_path变量。

如果你不是通过pytest来运行的话,我试了以下的代码也是可以运行的,注意路径需要传入绝对路径:

from dependency_graph import (
    construct_dependency_graph,
    GraphGeneratorType,
    Language,
)

sample_retriever = construct_dependency_graph(
    "/path/to/RepoFuse/repo_specific_semantic_graph/tests/code_example/python/cross_file_context",
    GraphGeneratorType.JEDI,
    Language.Python,
).as_retriever()
cross_file_edge_list = sample_retriever.get_cross_file_reference_by_line(
    "/path/to/RepoFuse/repo_specific_semantic_graph/tests/code_example/python/cross_file_context/main.py",
    18,
)
cross_file_edge_list

@CZH-THU
Copy link
Author

CZH-THU commented Jan 16, 2025

https://github.com/codefuse-ai/RepoFuse/blob/main/repo_specific_semantic_graph/dependency_graph/dependency_graph.py#L316-L321
我理解module_node至少有一个元素即file_path所在脚本,但当file_path="***/repo_specific_semantic_graph/tests/code_example/python/cross_file_context/main.py"时确为空list,这是为什么

没有太明白这个问题,是什么情况下module_node为空呢?

利用您提供的测试用例:cross_file_edge_list = sample_retriever.get_cross_file_definition_by_line( python_repo_suite_path / "cross_file_context" / "main.py", 18 ) 的时候module_node为空

可以检查下pytest运行的当前目录是否在repo_specific_semantic_graph/tests下,因为需要pytest读取repo_specific_semantic_graph/tests/conftest.py里面注入的python_repo_suite_path变量。

如果你不是通过pytest来运行的话,我试了以下的代码也是可以运行的,注意路径需要传入绝对路径:

from dependency_graph import (
    construct_dependency_graph,
    GraphGeneratorType,
    Language,
)

sample_retriever = construct_dependency_graph(
    "/path/to/RepoFuse/repo_specific_semantic_graph/tests/code_example/python/cross_file_context",
    GraphGeneratorType.JEDI,
    Language.Python,
).as_retriever()
cross_file_edge_list = sample_retriever.get_cross_file_reference_by_line(
    "/path/to/RepoFuse/repo_specific_semantic_graph/tests/code_example/python/cross_file_context/main.py",
    18,
)
cross_file_edge_list

您使用的是get_cross_file_reference_by_line函数,而我指的是get_cross_file_definition_by_line函数,https://github.com/codefuse-ai/RepoFuse/blob/main/repo_specific_semantic_graph/dependency_graph/dependency_graph.py#L316-L321
此处的module_node为空,我认为代码的过滤逻辑不应该使得module_node为空,因为"/path/to/RepoFuse/repo_specific_semantic_graph/tests/code_example/python/cross_file_context/main.py"自身就应该没有被过滤,也可能是我没搞明白module的定义。
并且如果在调用get_cross_file_definition_by_line函数前 先"from dependency_graph import output_dependency_graph
output_dependency_graph(graph, "edgelist", "cross_file_context.json")
output_dependency_graph(graph, "ipysigma", "cross_file_context.html")"
get_cross_file_definition_by_line函数也会得不到任何东西

@FunJim
Copy link
Collaborator

FunJim commented Jan 16, 2025

https://github.com/codefuse-ai/RepoFuse/blob/main/repo_specific_semantic_graph/dependency_graph/dependency_graph.py#L316-L321
我理解module_node至少有一个元素即file_path所在脚本,但当file_path="***/repo_specific_semantic_graph/tests/code_example/python/cross_file_context/main.py"时确为空list,这是为什么

没有太明白这个问题,是什么情况下module_node为空呢?

利用您提供的测试用例:cross_file_edge_list = sample_retriever.get_cross_file_definition_by_line( python_repo_suite_path / "cross_file_context" / "main.py", 18 ) 的时候module_node为空

可以检查下pytest运行的当前目录是否在repo_specific_semantic_graph/tests下,因为需要pytest读取repo_specific_semantic_graph/tests/conftest.py里面注入的python_repo_suite_path变量。
如果你不是通过pytest来运行的话,我试了以下的代码也是可以运行的,注意路径需要传入绝对路径:
from dependency_graph import (
construct_dependency_graph,
GraphGeneratorType,
Language,
)

sample_retriever = construct_dependency_graph(
"/path/to/RepoFuse/repo_specific_semantic_graph/tests/code_example/python/cross_file_context",
GraphGeneratorType.JEDI,
Language.Python,
).as_retriever()
cross_file_edge_list = sample_retriever.get_cross_file_reference_by_line(
"/path/to/RepoFuse/repo_specific_semantic_graph/tests/code_example/python/cross_file_context/main.py",
18,
)
cross_file_edge_list

您使用的是get_cross_file_reference_by_line函数,而我指的是get_cross_file_definition_by_line函数,https://github.com/codefuse-ai/RepoFuse/blob/main/repo_specific_semantic_graph/dependency_graph/dependency_graph.py#L316-L321 此处的module_node为空,我认为代码的过滤逻辑不应该使得module_node为空,因为"/path/to/RepoFuse/repo_specific_semantic_graph/tests/code_example/python/cross_file_context/main.py"自身就应该没有被过滤,也可能是我没搞明白module的定义。 并且如果在调用get_cross_file_definition_by_line函数前 先"from dependency_graph import output_dependency_graph output_dependency_graph(graph, "edgelist", "cross_file_context.json") output_dependency_graph(graph, "ipysigma", "cross_file_context.html")" get_cross_file_definition_by_line函数也会得不到任何东西

这里确实有问题,已经通过 #32 修复了。

@CZH-THU
Copy link
Author

CZH-THU commented Jan 21, 2025

https://github.com/codefuse-ai/RepoFuse/blob/main/repo_specific_semantic_graph/dependency_graph/dependency_graph.py#L316-L321
我理解module_node至少有一个元素即file_path所在脚本,但当file_path="***/repo_specific_semantic_graph/tests/code_example/python/cross_file_context/main.py"时确为空list,这是为什么

没有太明白这个问题,是什么情况下module_node为空呢?

利用您提供的测试用例:cross_file_edge_list = sample_retriever.get_cross_file_definition_by_line( python_repo_suite_path / "cross_file_context" / "main.py", 18 ) 的时候module_node为空

可以检查下pytest运行的当前目录是否在repo_specific_semantic_graph/tests下,因为需要pytest读取repo_specific_semantic_graph/tests/conftest.py里面注入的python_repo_suite_path变量。
如果你不是通过pytest来运行的话,我试了以下的代码也是可以运行的,注意路径需要传入绝对路径:
from dependency_graph import (
construct_dependency_graph,
GraphGeneratorType,
Language,
)
sample_retriever = construct_dependency_graph(
"/path/to/RepoFuse/repo_specific_semantic_graph/tests/code_example/python/cross_file_context",
GraphGeneratorType.JEDI,
Language.Python,
).as_retriever()
cross_file_edge_list = sample_retriever.get_cross_file_reference_by_line(
"/path/to/RepoFuse/repo_specific_semantic_graph/tests/code_example/python/cross_file_context/main.py",
18,
)
cross_file_edge_list

您使用的是get_cross_file_reference_by_line函数,而我指的是get_cross_file_definition_by_line函数,https://github.com/codefuse-ai/RepoFuse/blob/main/repo_specific_semantic_graph/dependency_graph/dependency_graph.py#L316-L321 此处的module_node为空,我认为代码的过滤逻辑不应该使得module_node为空,因为"/path/to/RepoFuse/repo_specific_semantic_graph/tests/code_example/python/cross_file_context/main.py"自身就应该没有被过滤,也可能是我没搞明白module的定义。 并且如果在调用get_cross_file_definition_by_line函数前 先"from dependency_graph import output_dependency_graph output_dependency_graph(graph, "edgelist", "cross_file_context.json") output_dependency_graph(graph, "ipysigma", "cross_file_context.html")" get_cross_file_definition_by_line函数也会得不到任何东西

这里确实有问题,已经通过 #32 修复了。

还有2个问题:

1、CrossCodeEval raw data数据集已联系[email protected],但没回应,您这边能否提供CrossCodeEval raw data数据集
2、如果修改了仓库源码或者在仓库中新增了脚本,有没有好的办法来更新图谱

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants