Code2Graph
Code2Graph copied to clipboard
Towards converting multilingual source code into one language-agnostic graph representation.
Fix #124
基本需求:实现一个方法,生成带版本的项目缓存,输出一个 `Map` 到本地文件,键是 commit hash,值为对应版本的 URITree。在 client 包中实现即可。 --- - 关于输入的项目 - 可以是一个真正的 git 项目(需要通过命令行工具切换版本,做起来可能有困难) - 也可以是一个以 commit hash 为子目录名的目录 + 一个入口文件作为索引并存储元信息(commit 顺序是有意义的) - 关于路径格式 - 希望能将输入项目和生成的缓存都放在这个仓库内,然后添加 .gitignore 来忽略对应的项目 -...
遇到一个挺迷的bug,推测与auto有关 如上图,第一条用红框框出的uri实际并不存在于uriTree,它的真身应该是第二个红框内的uri。 输入的oldURI和newURI为: ``` def://app/src/main/res/layout/toolbar.xml[language=FILE]//LinearLayout/android.support.v7.widget.Toolbar/android:id[language=XML]//@+id\\/toolbar[language=ANY] def://app/src/main/res/layout/toolbar.xml[language=FILE]//LinearLayout/android.support.v7.widget.Toolbar/android:id[language=XML]//@+id\\/tool_bar[language=ANY] ``` 这种情况发生在我使用如下的rule时: ```yaml r-id: use: lang: JAVA file: '(&javaFile).java' identifier: R.id.(name) def: lang: XML file: (&layoutName).xml identifier: android:id inline: identifier: '@+id\/(name)' ``` 如果给name加上modifier就不会出现: ```yaml...
为了实现对xml文件中并非直接与java元素link的identifier的rename,我加入了以下rule: ```yaml r-xml-inner: # hidden: true def: lang: XML file: (&layoutName).xml identifier: android:id inline: identifier: '@+id\/(&name)' use: lang: XML file: (&layoutName).xml identifier: "*constraint*" inline: identifier: '*\/(&name)' ``` 根据这条rule可以在某个例子中得到如下的inner link: ```...
姑且列一下,刚刚想到解决方法了。
``` // input use://app/src/main/java/org/schabi/newpipe/fragments/detail/DescriptionFragment.java[language=FILE]//DescriptionFragment/setupUploadDate/binding.detailUploadDateView[language=JAVA] use://app/src/main/java/org/schabi/newpipe/fragments/detail/DescriptionFragment.java[language=FILE]//DescriptionFragment/setupUploadDate/binding.uploadDateView[language=JAVA] // output def://app/src/main/res/layout/fragment_description.xml[language=FILE]//androidx.core.widget.NestedScrollView/androidx.constraintlayout.widget.ConstraintLayout/TextView/android:id[language=XML]//@+id\\/detail_upload_date_view[language=ANY] def://app/src/main/res/layout/fragment_description.xml[language=FILE]//androidx.core.widget.NestedScrollView/androidx.constraintlayout.widget.ConstraintLayout/TextView/android:id[language=XML]//@+id\\/uploadDateView[language=ANY] ``` 使用的rule: ```yaml # binding.widgetId @+id/widgetId r-dataBinding: use: lang: JAVA file: '(&javaFile).java' identifier: (&bindingVar).(name:camel) def: lang: XML file: (&layoutName).xml identifier: android:id...
一般情况下,开发者完全按照规范中规定的case命名,比如: ``` def: @+id/widget_name use: binding.widgetName ``` 因为widget_name从snake case转为camel case是widgetName,所以这个例子是正确的。 有部分特殊情况下,命名并没有那么规范,比如: ``` def: @+id/widgetName use: binding.widgetName ``` 因为widgeName作为snake case被视为单个词组成的,转为camel case也是widgetName,所以这个例子也是正确的。 对于这个xll pattern,我们写的rule为: 但这条rule无法捕捉到特殊情况下的case。 考虑在modifier缺省的情况下自动分割identifier,使在rule定义为下图时,一般情况和特殊情况都能被捕捉。
@Shigma 之前默认的行为是单条use只匹配多条def,按优先级匹配,一条use匹配到了def以后,优先级较低的rule就算也能为这条use匹配到def也不会被计入结果。 但是针对这个设计有一些反例。 情况1:由于动态因素等的介入,一个ref identifier本身就对应多个def 如在安卓项目中存在不同尺寸的layout文件,虽然组件组成相同(即文件内容)但放在不同路径下 但在java文件中对组件的引用并不会分开写,所以此处的引用标识符应当理解为有两处def: 不过这个例子在实际focus中并不会有问题,它会被判定为ambiguous,但最终输出依然会同时包含这两个link,因为它们同属于一条rule。我没能找到更适合的例子,所以编个假设情景:如果有例子里两个def对应的rule不同的话(比如,如果我写的rule更加精确,r-layout这条rule只匹配layout文件夹下的layout文件,另设一条rule只匹配layout-large-land下的layout文件),就会出现问题。 情况2:设想两条rule,存在两条link分别对应这两条rule并且use uri相同。为什么会存在这样的写法是因为两条rule匹配的重点不一样,一条rule匹配的是一个变量本身,另一条rule匹配的是这个变量对应的uri的其他要素,比如varType attribute。编个例子: ```yaml r1: use: identifier: (class)/(name) def: identifier: (sqlTag)/#{(name)} r2: use: identifier: (name) varType: (layout)Binding def: file: (layout).xml ``` 不过这只是个纯设想的情景,贴上来只是起个参考作用,应该并没有实际的rule有这样的情况...
架构问题: inline语言在gen.x模块内部还是外部处理? 对xml这样的DSL而言,语言仅提供了一种规范,但每个框架的dialect schema不同,难以目前必须写特殊handler(MybatisMapperHandler和AndroidHandler),对于扩展性而言带来了额外的负担 支持新的语言加gen.X。如果新语言b为一种语言a的dialect,则需要在gen.a下添加b的handler
1. 重构GitService接受repoPath作为field而非每个方法的参数 2. 使用JGit实现GitService中的API 3. 将GitService独立为另一个repo进行维护以方便复用