CN110032366A - 一种代码定位方法及装置 - Google Patents
一种代码定位方法及装置 Download PDFInfo
- Publication number
- CN110032366A CN110032366A CN201910317165.4A CN201910317165A CN110032366A CN 110032366 A CN110032366 A CN 110032366A CN 201910317165 A CN201910317165 A CN 201910317165A CN 110032366 A CN110032366 A CN 110032366A
- Authority
- CN
- China
- Prior art keywords
- location
- target
- code block
- depth
- description information
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/45—Exploiting coarse grain parallelism in compilation, i.e. parallelism between groups of instructions
- G06F8/451—Code distribution
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
- Mobile Radio Communication Systems (AREA)
Abstract
本申请公开了一种代码定位方法及装置,方法包括:接收定位请求指令,定位请求指令至少包括待定位的目标代码块的至少一个属性信息;响应于所述定位请求指令,获得目标代码块所属的代码文件的第一位置链表,其中,第一位置链表中包括至少一个位置对象,位置对象中包括其对应的代码块的描述信息;在第一位置链表内,确定目标位置对象,目标位置对象具有与目标代码块的属性信息相对应的描述信息;基于目标位置对象的描述信息,获得目标代码块在代码文件中的位置信息。可见,本申请中利用代码文件的包含各代码块的描述信息的位置对象来定位目标代码块在代码文件中的位置信息,无需人工查找等操作,进而节省定位消耗的工作时长,从而提高定位效率。
Description
技术领域
本申请涉及软件开发技术领域,特别涉及一种代码定位方法及装置。
背景技术
Protocol Buffers是一种轻便高效的语言无关、平台无关、可扩展的序列化结构数据存储格式,可以编译成相应的C++、Java、Python类。目前,Protocol Buffer通常使用元数据描述或记录代码块在代码文件中的相关信息,如名称或类型等属性信息。在ProtocolBuffer的使用过程中需要对代码块的元数据进行查找和定位修改位置等操作。
而基于Protocol Buffers中的代码块往往存在大量的引用、扩展、嵌套、重名等情况,由此,目前通过人工查找及定位的方式实现对代码块进行定位的方案,通常存在定位效率较低的问题。
发明内容
有鉴于此,本申请的目的在于提供一种代码定位方法及装置,用以解决现有技术中代码块定位的效率较低的技术问题。
本申请提供了一种代码定位方法,包括:
接收定位请求指令,所述定位请求指令至少包括待定位的目标代码块的至少一个属性信息;
响应于所述定位请求指令,获得所述目标代码块所属的代码文件的第一位置链表,其中,所述第一位置链表中包括至少一个位置对象,所述位置对象中包括其对应的代码块的描述信息;
在所述第一位置链表内,确定目标位置对象,所述目标位置对象具有与所述目标代码块的属性信息相对应的描述信息;
基于所述目标位置对象的描述信息,获得所述目标代码块在所述代码文件中的位置信息。
上述方法,优选地,所述在所述第一位置链表内的位置对象中,确定目标位置对象,包括:
在所述第一位置链表内,筛选出具有与所述目标代码块的类型属性相对应的位置对象,以组成第二位置链表;
在所述第二位置链表内的位置对象中,确定出具有与所述目标代码块的名称属性相对应的描述信息的目标位置对象。
上述方法,优选地,所述在所述第二位置链表内的位置对象中,确定出具有与所述目标代码块的名称属性相对应的描述信息的目标位置对象,包括:
在所述第二位置链表内,基于所述位置对象的描述信息所表征的所述位置对象之间的嵌套关系信息,获得嵌套在最外层的至少一个第一位置对象;
在所述至少一个第一位置对象中以及所述第一位置对象内所嵌套的深层位置对象中,进行递归遍历,以确定出具有与所述目标代码块的名称属性相对应的描述信息的目标位置对象。
上述方法,优选地,所述在所述至少一个第一位置对象中及所述第一位置对象内所嵌套的深层位置对象中进行递归遍历,包括:
从所述第一位置对象所在的最外层作为当前层开始,比对所述当前层的当前遍历深度与所述目标代码块的路径目标深度;
如果所述当前遍历深度与所述路径目标深度相同,在所述当前层的位置对象中,查找具有与所述目标代码块的名称属性相对应的描述信息的目标位置对象,结束遍历;
如果所述当前遍历深度小于所述路径目标深度,在所述当前层的位置对象中,查找具有与所述目标代码块的完整路径相匹配的描述信息的命中位置对象,如果查找到,将所述当前遍历深度加1并将所述命中位置对象中所嵌套的下一层作为当前层,返回执行所述比对所述当前层的当前遍历深度与所述目标代码块的路径目标深度的步骤,如果没有查找到,结束遍历。
上述方法,优选地,如果所述当前遍历深度与所述路径目标深度相同,所述方法还包括:
如果所述当前遍历深度与所述路径目标深度相同且不为1,在所述当前层的位置对象中,基于所述当前层的位置对象所嵌套的最外层位置对象的描述信息,查找具有与所述目标代码块的名称属性相匹配的描述信息的目标位置对象,如果没有查找到,结束遍历;
如果所述当前遍历深度与所述路径目标深度相同且为1,在所述当前层的位置对象中,基于所述当前层的位置对象的描述信息,查找具有与所述目标代码块的名称属性相匹配的描述信息的目标位置对象,如果没有查找到,结束遍历。
上述方法,优选地,所述在所述第二位置链表内的位置对象中,确定出具有与所述目标代码块的名称属性相对应的描述信息的目标位置对象,包括:
在所述第二位置链表内的位置对象中,基于所述描述信息所表征的所述位置对象之间的嵌套关系信息,建立树形结构,所述树形结构包括至少一层节点,所述节点为所述第二位置链表内的位置对象;
遍历所述树形结构中的节点,以确定具有与所述目标代码块的名称属性相对应的描述信息的目标位置对象。
上述方法,优选地,所述遍历所述树形结构中的节点,以确定具有与所述目标代码块的名称属性相对应的描述信息的目标位置对象,包括:
从所述树形结构中的第一层节点对应的位置对象开始,比对当前遍历深度与所述目标代码块的路径目标深度;
如果所述当前遍历深度与所述路径目标深度相同且均为1,在所述当前层的位置对象中,基于所述当前层的位置对象的描述信息,查找与所述目标代码块的名称属性相匹配的描述信息的目标位置对象,如果没有查找到,结束遍历;
如果所述当前遍历深度小于所述路径目标深度,在所述当前层的位置对象中,查找具有与所述目标代码块的完整路径相匹配的描述信息的命中位置对象,如果查找到,将所述当前遍历深度加1并将所述命中位置对象所嵌套的下一层作为当前层,返回执行所述比对当前遍历深度与所述目标代码块的路径目标深度的步骤,如果没有查找到,结束遍历;
如果所述当前遍历深度与所述路径目标深度相同且不为1,在所述当前层的位置对象中,基于所述当前层的位置对象的描述信息,查找具有与所述目标代码块的名称属性相匹配的描述信息的目标位置对象,如果没有查找到,结束遍历。
本申请还提供了一种代码定位装置,包括:
接收单元,用于接收定位请求指令,所述定位请求指令至少包括待定位的目标代码块的至少一个属性信息;
获得单元,用于响应于所述定位请求指令,获得所述目标代码块所属的代码文件的第一位置链表,其中,所述第一位置链表中包括至少一个位置对象,所述位置对象中包括其对应的代码块的描述信息;
确定单元,用于在所述第一位置链表内的位置对象中,确定目标位置对象,所述目标位置对象具有与所述目标代码块的属性信息相对应的描述信息;
位置获取单元,用于基于所述目标位置对象的描述信息,获得所述目标代码块在所述代码文件中的位置信息。
由以上方案可知,本申请提供的一种代码定位方法及装置,通过获得待定位的目标代码块所在代码文件的位置链表,进而在位置链表中所包含的具有代码块描述信息的位置对象中,定位到具有与目标代码块的属性信息相对应的描述信息的目标位置对象,进而在目标位置对象的描述信息中获得到目标代码块在代码文件中的相应位置信息,如起始行和起始列等。可见,本申请中利用代码文件的包含各代码块的描述信息的位置对象来定位目标代码块在代码文件中的位置信息,无需人工查找等操作,进而节省定位消耗的工作时长,从而提高定位效率。
附图说明
为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
图1为本申请实施例一提供的一种代码定位方法的流程图;
图2为本申请实施例的示例图;
图3为本申请实施例提供的一种代码定位方法的部分流程图;
图4及图5分别为本申请实施例的另一示例图;
图6为本申请实施例二提供的一种代码定位装置的结构示意图。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
参考图1,为本申请实施例一提供的一种代码定位方法的流程图,该方法适用于具有数据处理能力的计算机或服务器中,主要用于在包含多个代码块的代码文件中定位目标代码块,例如,在a软件的代码包中定位b消息或c字段的具体位置。
具体的,本实施例中的代码定位方法可以包括以下步骤:
步骤101:接收定位请求指令。
其中,定位请求指令至少包括待定位的目标代码块的至少一个属性信息。待定位的目标代码块可以为需要定位在代码文件中的位置信息的消息、函数或字段等代码块。而目标代码块的属性信息可以为目标代码块在代码文件中的完整路径、在完整路径中的路径深度、目标代码块的代码块类型、代码块名称等信息。
可见,在代码文件中,定位请求指令响应于软件开放工作人员或用于基于对目标代码块进行定位的需求输入操作所触发,并基于目标代码块的至少一个属性信息所生成,进而本实施例中接收该定位请求指令,并响应于该定位请求指令,执行后续流程。
步骤102:获得目标代码块所属的代码文件的第一位置链表。
其中,第一位置链表中包括至少一个位置对象,而每个位置对象对应一个代码块,位置对象中包括有其对应的代码块的描述信息,如代码块的起始位置、结束位置、代码块或单词含义、代码块之间嵌套或隶属关系描述或代码块索引描述信息等。
以Protocol Buffers语言代码为例,在Protocol Buffers中,proto文件中包含各种代码块,如message类型的代码块或msg字段等。Protocol Buffers(简称PB)通过命令行执行编译,可以通过指定参数自定义编译过程,PB编译器实际是一组递归下降的CodeGenerator类集,其中,编译器的输入是Descriptor类集,而输出则为具体的派生消息类,如图2中所示,整个执行过程包括:首先,基于词法、语法等分析并解释proto文件,将全部解释出来的信息保存到FileDescriptorProto对象中,然后,基于FileDescriptorProto对象生成proto描述对象即FileDescriptor对象,最后,编译器的CodeGenerator从FileDescriptor对象生成具体的派生消息类,进而生成相关的类文件,如C++、Java、Python等。
其中,Protocol Buffers协议保存在.proto为后缀名的文件中,使用C语言实现的编译器能够按照指定参数将.proto文件编译成相应语言的类文件,而按照协议定义descriptor.proto文件可以完整的描述所有的.proto文件,也包括它自身,例如,代码文件中每个代码元素的类型、位置、注释等信息都会被放到编译生成的数据结构中。
具体的,Proto文件的详细信息都被保存到了SourceCodeInfo结构中,该结构只有一个Location类型的链表,即前文中的位置链表,该链表包含多个Location对象,即前文中的位置对象。其中,Location中除了用一个整型链表span描述proto文件中每个单词的位置信息,还对代码单词的含义、隶属等信息用一个整型的索引链表path来描述,为了描述整个文件的结构,Location对象中先描述整体,再按块描述,块内按行描述,行内按单词描述,其中在描述行时Location对象还有两个变量,leading_comments和trailing_comments,用来记录行之前或之后的注释。
如下location对象中的span和path所示,其中,以下location对象描述MyMessage消息中的msg字段整体:
[path:4//与上面的location类似,仍然是message类型
path:0//同上,还是MyMessage消息
path:2//message_type为DescriptorProto类型,DescriptorProto的field编号为2,描述的是MyMessage的字段
path:0//描述当前字段在MyMessage所有字段中的索引,0表示第一个,也就是上面的msg字段
span:9//msg字段的起始行号
span:2//msg字段的起始列号
span:43//msg字段的结束列号
leading_comments:"Block comment\n"//该字段前的注释
trailing_comments:"hello world\n"//该字段后面的注释]
可见,本实施例中所获得的第一位置链表中,通过位置对象描述各种代码块的描述信息。
步骤103:在第一位置链表内,确定目标位置对象。
其中,目标位置对象具有与目标代码块的属性信息相对应的描述信息。也就是说,本实施例在第一位置链表内的位置对象中,确定具有与目标代码块的属性信息相对应的描述信息的目标位置对象。
需要说明的是,本实施例中可以利用遍历、栈或者队列等方式或算法在第一位置链表内的位置对象中确定出目标位置对象。
步骤104:基于目标位置对象的描述信息,获得目标代码块在代码文件中的位置信息。
其中,本实施例中从目标位置对象的描述信息,如前文中的Location对象的span字段信息,提取出目标代码块在代码文件中的位置信息,如span字段中所表征的起始行和列以及结束行和列的信息。
由以上方案可知,本申请实施例一提供的一种代码定位方法,通过获得待定位的目标代码块所在代码文件的位置链表,进而在位置链表中所包含的具有代码块描述信息的位置对象中,定位到具有与目标代码块的属性信息相对应的描述信息的目标位置对象,进而在目标位置对象的描述信息中获得到目标代码块在代码文件中的相应位置信息,如起始行和起始列等。可见,本实施例中利用代码文件的包含各代码块的描述信息的位置对象来定位目标代码块在代码文件中的位置信息,无需人工查找等操作,进而节省定位消耗的工作时长,从而提高定位效率。
具体的,步骤103在确定目标位置对象时具体可以通过以下方式实现:
首先,在第一位置链表中的位置对象中,筛选出具有与目标代码块的类型属性相对应的位置对象,如将目标代码块的类型属性与第一位置链表中的各个位置对象的描述信息进行匹配,进而将匹配出的位置对象筛选出来,以组成第二位置链表,例如,在第一位置链表的位置对象中,筛选出message类型的位置对象,或者筛选出msg字段类型的位置对象,从而组成第二位置链表;
之后,在第二位置链表内的位置对象中,确定出具有与目标代码块的名称属性相对应的描述信息的目标位置对象。
在一种实现方式中,本实施例中步骤103在在第二位置链表内的位置对象中,确定目标位置对象时,具体可以通过以下方式实现,如图3中所示:
步骤301:在第二位置链表内,基于描述信息所表征的位置对象之间的嵌套关系信息,获得嵌套在最外层的第一位置对象。
其中,描述信息所表征的位置对象之间的嵌套关系信息,可以理解为:位置对象所对应的代码块之间的嵌套关系信息,如图4中,代码块A内嵌套有B,B内嵌套有C。
而本实施例中具体可以通过以下方式获得最外层的第一位置对象:
首先,对第二位置链表内的位置对象中,去掉第一个位置对象,因为该第一个位置对象描述的是整个代码文件的位置信息,因此,为了减少后续处理的工作量,可以先将第一个位置对象删掉;
之后,在第二位置链表剩余的位置对象中筛选出span个数为4的位置对象,以确定后续遍历的位置对象均描述有位置信息;
最后,选出第二位置链表中剩余的某一个位置对象作为当前的位置对象,再依次选出另一个位置对象与当前的位置对象进行嵌套关系比对,如果选出的位置对象所对应的代码块是当前的位置对象所对应的代码块的内部代码块,那么过滤到选出的位置对象,以此类推,直到选出第二位置链表中嵌套在最外层的一个或多个第一位置对象,该第一位置对象为代码文件中嵌套在最外层的代码块所对应的位置对象。
步骤302:从第一位置对象所在的最外层作为当前层开始,比对当前层的当前遍历深度与目标代码块的路径目标深度,如果当前遍历深度与路径目标深度相同且为1,执行步骤303,如果当前遍历深度与路径目标深度相同且不为1,执行步骤304,如果当前遍历深度小于路径目标深度,执行步骤305。
其中,目标代码块的路径目标深度可以基于目标代码块的完整路径确定,例如,目标代码块D的完整路径为A/B/D,那么目标代码块的路径目标深度为3;再如,目标代码块B的完整路径为A/B,那么目标代码块的路径目标深度为2;再如,目标代码块A的完整路径为A,那么目标代码块的路径目标深度为1,如图4中所示。
而当前层的当前遍历深度可以理解为:当前层在代码块所形成的嵌套关系中的深度,如第一层遍历A时当前遍历深度为1;再如,从A遍历到下一层B时,当前遍历深度为2;再如,从A遍历到下层B再遍历到D时,当前遍历深度为3。
步骤303:在当前层的位置对象中,基于当前层的位置对象的描述信息,查找具有与目标代码块的名称属性相匹配的描述信息的目标位置对象,如果没有查找到,结束遍历。
其中,查找到的目标位置对象即为描述目标代码块的位置信息的对象,此时基于目标位置对象的描述信息,获得目标代码块在代码文件中的位置信息。例如,如果当前遍历深度与路径目标深度相同且为1,说明没有递归无需进行下一层的对象遍历,此时,在当前层中遍历每个span个数为4的location对象,根据location对象中的path字段从FileDescritptorProto结构中找到该location对象对应的message代码块的描述对象,进而判断该描述对象中的名称是否与待定位的message代码块的名称相同,如果相同,则命中返回该location对象,进而从该location对象的描述信息中提取到span字段中所记录的位置信息,如果没有找到相同名称的location对象,那么没有命中则返回未找到。
步骤304:在当前层的位置对象中,基于当前层的位置对象所嵌套的最外层对象的描述信息,查找具有与目标代码块的名称属性相匹配的描述信息的目标位置对象,如果没有查找到,结束遍历。
其中,查找到的目标位置对象即为描述目标代码块的位置信息的对象,此时基于目标位置对象的描述信息,获得目标代码块在代码文件中的位置信息。例如,如果当前遍历深度与路径目标深度相同且不为1,说明已经有递归且已经达到临界,此时,在当前层中遍历每个span个数为4的location对象,根据location对象中的path字段从FileDescritptorProto结构中找到该location对象对应的message代码块的最外层message的描述对象,并按照深度遍历嵌套类型的描述对象达到当前深度后取出message代码块的描述对象,进而判断该描述对象中的名称是否与待定位的message代码块的名称相同,如果相同,则命中返回该location对象,进而从该location对象的描述信息中提取到span字段中所记录的位置信息,如果没有找到相同名称的location对象,那么没有命中则返回未找到。
步骤305:在当前层的位置对象中,查找具有与目标代码块的完整路径相匹配的描述信息的命中位置对象,如果查找到,将当前遍历深度加1并将命中位置对象中所嵌套的下一层作为当前层,返回执行步骤302中继续比对当前层的当前遍历深度与目标代码块的路径目标深度,如果没有查找到,则结束遍历。
也就是说,在当前遍历深度没有到达路径目标深度时,仍需要进一步递归遍历,此时需要确定与目标代码块的完整路径相匹配的命中位置对象,命中位置对象所对应的代码块的路径与目标代码块的完整路径在当前遍历深度对应的路径深度及之前是相匹配或者说是相一致的,如果找到命中位置对象,那么获得该命中位置对象内所嵌套的下一层位置对象,并在将当前遍历深度加1之后,将获得这下一层位置对象作为当前层,继续在当前层中继续递归遍历。需要说明的是,获得该命中位置对象内所嵌套的下一层位置对象的方式可以参考前文中步骤301中获得嵌套在最外层的第一位置对象的实现方式,此处不再详述。
例如,遍历当前层的每个location对象中,具体的,对于每个location对象,根据location对象的path字段从FileDescritptorProto结构中找到该location对象对应的message代码块的最外层message的描述对象,并按照深度遍历嵌套类型的描述对象达到当前深度后取出嵌套类型的描述对象,进而判断该描述对象中的路径名称是否与待定位的message完整路径中的当前遍历路径的名称相同,如果相同,那么说明待定位的message代码块隶属于当前遍历的这个location对象对应的代码块,此时当前深度加1,并获取当前location对象所嵌套的下一层location对象,其他参数保持不变继续递归重复之前的流程,而如果不同,那么返回未找到。
在一种实现方式中,本实施例中步骤103在在第二位置链表内的位置对象中,确定目标位置对象时,具体可以通过以下方式实现:
首先,在第二位置链表内的位置对象中,基于描述信息所表征的位置对象之间的嵌套关系信息,建立树形结构,树形结构包括至少一层节点,节点为第二位置链表内的位置对象,如图5中所示;
之后,遍历树形结构中的节点,以确定具有与目标代码块的名称属性相对应的描述信息的目标位置对象。
具体的,在遍历树形结构中的节点时,可以通过以下方式实现:
从树形结构中的第一层节点对应的位置对象开始,比对当前遍历深度与目标代码块的路径目标深度;
如果当前遍历深度与路径目标深度相同且均为1,在当前层的位置对象中,基于当前层的位置对象的描述信息,查找与目标代码块的名称属性相匹配的描述信息的目标位置对象,如果没有查找到,结束遍历;
如果当前遍历深度小于路径目标深度,在当前层的位置对象中,查找具有与目标代码块的完整路径相匹配的描述信息的命中位置对象,如果查找到,将当前遍历深度加1并将命中位置对象所嵌套的下一层作为当前层,返回执行比对当前遍历深度与目标代码块的路径目标深度的步骤,如果没有查找到,结束遍历;
如果当前遍历深度与路径目标深度相同且不为1,在当前层的位置对象中,基于当前层的位置对象的描述信息,查找具有与目标代码块的名称属性相匹配的描述信息的目标位置对象,如果没有查找到,结束遍历。
在本实施例中,具体的实现方式可以参考前文中图4相关的内容,此处不再详述。
以下以在Protocol Buffers的proto文件中定位代码块C为例,对以上本实施例中的技术实现进行说明:
C的完整路径knowledge.pub.options.A.B.C。具体流程如下:
1、获得C所在proto文件的locationlist,及位置对象的链表,例如,locationlist中具有29个location对象。
2、找出span个数为4个的location,这种类型的location代表的是代码块,如代码块A、B、C、D。
3、首先要找出最外层的message A对应的location,具体的:先从除message A对应的location外的28个location里找出所有的span个数为4的代码块对应的location,然后排除掉内层的代码块,在本实施例中就是排除B和C保留A,因为B和C是在A的内层,如果还有个D,并且D和A都在同一层,那这次应该取出了A和D。
4、本实施例中message A就是第一层的message,有了messageA的Location以后,比较当前的层数1与目标message的层数3的大小,如果小于,则在A里继续找(如果有D的话也会去D里找),判断的依据就是目标message的完整路径中是否命中A或者D,如果命中A则去A里找,如果命中D则去D里找。本例中只有A,所以就去A里找,在A里找的过程跟上述过程完全一样,所以从这里开始递归,找出A里面所有的代码块的location,当前深度加一,因为又深入一层,继续重复上述的定位流程,直至目标message路径中的所有message全部命中,找到的location就是目标message,从location里能取到message的定位行号。例如,第一次递归中,输入message A里面的所有代码块的26个location,第一个是最外层的A,第二个是A里的B,第三个是B里的C。类似首次,去掉最外层的A,剩下B和C,之前去掉第一个是对整个文件location的描述,这个是首次的最外层,这次的A也是最外层的套。
5、在找到当前层是B时,因为B命中了C的完整路径中的第二层,然后要进入B了,第一次递归之后,这次B里面的所有代码块的location中,根据location中的path字段去前文提到的descriptor结构里面找到当前location的message信息,发现当前的location对应的message是B,命中了C的路径中的第二层,所以C有可能在B中,所以又开始第二次递归,此时B是最外层,C是内层的location。
6、在进入B之后,此时的层数是3,等于C的路径长度,已经到达该结束递归的条件,这次如果没找到C说明不存在,在B里面的location,依次取出B里面span个数为4的location,再去location里的path去descriptor结构里拿详细信息,如果和C的名称一致说明找到了,例如,在B的descriptor的结构的nestType中拿到B里面的message的名字,其中,取这些信息需要根据B的path字段去找,取出来发现message名字就是C,与目标命中,那当前的这个location就是最终要找的C,然后取出C的首行号9(行号是从0开始,即第10行)。
7、返回location,所有递归结束,如果再递归过程的任何环节出现异常和找不到都会退出表示找不到。
参考图6,为本申请实施例二提供的一种代码定位装置的结构示意图,该结构适用于具有数据处理能力的计算机或服务器中,主要用于在包含多个代码块的代码文件中定位目标代码块,例如,在a软件的代码包中定位b消息或c字段的具体位置。
具体的,在本实施例中,该装置可以包括以下结构:
接收单元601,用于接收定位请求指令,定位请求指令至少包括待定位的目标代码块的至少一个属性信息;
获得单元602,用于响应于定位请求指令,获得目标代码块所属的代码文件的第一位置链表,其中,第一位置链表中包括至少一个位置对象,位置对象中包括其对应的代码块的描述信息;
确定单元603,用于在第一位置链表内,确定目标位置对象,目标位置对象具有与目标代码块的属性信息相对应的描述信息;
位置获取单元604,用于基于目标位置对象的描述信息,获得目标代码块在代码文件中的位置信息。
由以上方案可知,本申请实施例二提供的一种代码定位装置,通过获得待定位的目标代码块所在代码文件的位置链表,进而在位置链表中所包含的具有代码块描述信息的位置对象中,定位到具有与目标代码块的属性信息相对应的描述信息的目标位置对象,进而在目标位置对象的描述信息中获得到目标代码块在代码文件中的相应位置信息,如起始行和起始列等。可见,本实施例中利用代码文件的包含各代码块的描述信息的位置对象来定位目标代码块在代码文件中的位置信息,无需人工查找等操作,进而节省定位消耗的工作时长,从而提高定位效率。
需要说明的是,本实施例中代码定位装置的各单元的具体实现可以参考前文中相关内容,此处不再详述。
以下在Protocol Buffers的proto文件中定位message代码块为例,对本实施例中的技术方案进行总结说明:
本实施例的实现基于前文中的数据结构,并将proto文件中的代码按块划分,每个小块儿又可以按照其父结构的划分方式分析,由此,本实施例中可以通过不断的递归调用自身,直到定位到目标才返回,以定位message为例,本实施例的输入包括保存在SourceCodeInfo中的Location链表A、message的完整路径full path、当前深度currentdepth、目标深度depth,message类型type,本实施例的输出为目标message的整体Location,从该location中能够得到目标message的起始行、结束行、起始列、结束列,执行过程如下:
1.去掉Location链表中第一个Location,该Location描述的是文件中整个代码块的位置信息。
2.遍历链表剩余部分中的每一个location、span数为4的location描述代码块discripter,首先,要找出一个当前层span数为4的location,每取出一个span数为4的location都要和已经找到的当前层span数为4的location作比较,如果该location是当前层任何一个的内部location则被过滤掉,如果不是则添加到当前层span数为4的location链表B中。最终找到的location就是当前层所有message代码块儿的位置信息,这样就完成了当前层的代码块划分。
3.如果当前深度和目标深度相同且目标深度为1,说明没有递归,则遍历当前层span数为4的location链表中的每一个location,根据location的path字段从FileDescritptorProto结构中找到message的描述对象判断其名称是否与目标message名称相同,如果命中,则返回该location,如果未命中则返回未找到。
4.如果当前深度和目标深度相同且目标深度不为1,说明已经有递归且达到临界,则遍历当前层span数为4的location链表中的每一个location,根据location的path字段从FileDescritptorProto结构中找到该location的最外层描述对象,按照深度遍历嵌套类型的描述对象,达到当前深度后取出message的描述对象判断其名称是否与目标message的名称相同,如果相同则命中返回,如果未命中,则返回未找到。
5.如果当前深度小于目标深度,则取出当前层span数为4的location链表中的每一个location,根据location的path字段从FileDescritptorProto结构中找到该location最外层message描述对象,按照深度遍历嵌套类型的描述对象,达到当前深度后取出嵌套类型的描述对象判断其名称是否与当前路径的名称相同,如果相同,则将隶属于当前location的全部location组成链表,当前深度加一,其他参数保持不变递归调用自身,重复执行上述流程,如果不同,则返回未找到。
可见,本实施例中根据以上定位方案可以实现元数据代码块添加的自动化,只需知道要修改元数据的路径就可以定位到它在proto文件中的具体坐标,从而可以通过系统自动添加,相较于人工查找,节省了开发成本,在元数据频繁修改的场景下,本实施例的方案更具有高效性、准确性与可重复性。具体的,用户可以通过界面的方式查看元数据的定义,由系统记录用户要更改的路径及内容,定位到改动位置后添加,提高了开发效率,另外,本实施例中的方案为更好的利用Protocol Buffers描述性数据结构提供了思路,例如Protocol Buffers的反编译。
需要说明的是,本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。
最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
以上对本申请所提供的一种代码定位方法及装置进行了详细介绍,对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本申请。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本申请的精神或范围的情况下,在其它实施例中实现。因此,本申请将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
Claims (8)
1.一种代码定位方法,其特征在于,包括:
接收定位请求指令,所述定位请求指令至少包括待定位的目标代码块的至少一个属性信息;
响应于所述定位请求指令,获得所述目标代码块所属的代码文件的第一位置链表,其中,所述第一位置链表中包括至少一个位置对象,所述位置对象中包括其对应的代码块的描述信息;
在所述第一位置链表内,确定目标位置对象,所述目标位置对象具有与所述目标代码块的属性信息相对应的描述信息;
基于所述目标位置对象的描述信息,获得所述目标代码块在所述代码文件中的位置信息。
2.根据权利要求1所述的方法,其特征在于,所述在所述第一位置链表内的位置对象中,确定目标位置对象,包括:
在所述第一位置链表内,筛选出具有与所述目标代码块的类型属性相对应的位置对象,以组成第二位置链表;
在所述第二位置链表内的位置对象中,确定出具有与所述目标代码块的名称属性相对应的描述信息的目标位置对象。
3.根据权利要求2所述的方法,其特征在于,所述在所述第二位置链表内的位置对象中,确定出具有与所述目标代码块的名称属性相对应的描述信息的目标位置对象,包括:
在所述第二位置链表内,基于所述位置对象的描述信息所表征的所述位置对象之间的嵌套关系信息,获得嵌套在最外层的至少一个第一位置对象;
在所述至少一个第一位置对象中以及所述第一位置对象内所嵌套的深层位置对象中,进行递归遍历,以确定出具有与所述目标代码块的名称属性相对应的描述信息的目标位置对象。
4.根据权利要求3所述的方法,其特征在于,所述在所述至少一个第一位置对象中及所述第一位置对象内所嵌套的深层位置对象中进行递归遍历,包括:
从所述第一位置对象所在的最外层作为当前层开始,比对所述当前层的当前遍历深度与所述目标代码块的路径目标深度;
如果所述当前遍历深度与所述路径目标深度相同,在所述当前层的位置对象中,查找具有与所述目标代码块的名称属性相对应的描述信息的目标位置对象,结束遍历;
如果所述当前遍历深度小于所述路径目标深度,在所述当前层的位置对象中,查找具有与所述目标代码块的完整路径相匹配的描述信息的命中位置对象,如果查找到,将所述当前遍历深度加1并将所述命中位置对象中所嵌套的下一层作为当前层,返回执行所述比对所述当前层的当前遍历深度与所述目标代码块的路径目标深度的步骤,如果没有查找到,结束遍历。
5.根据权利要求4所述的方法,其特征在于,如果所述当前遍历深度与所述路径目标深度相同,所述方法还包括:
如果所述当前遍历深度与所述路径目标深度相同且不为1,在所述当前层的位置对象中,基于所述当前层的位置对象所嵌套的最外层位置对象的描述信息,查找具有与所述目标代码块的名称属性相匹配的描述信息的目标位置对象,如果没有查找到,结束遍历;
如果所述当前遍历深度与所述路径目标深度相同且为1,在所述当前层的位置对象中,基于所述当前层的位置对象的描述信息,查找具有与所述目标代码块的名称属性相匹配的描述信息的目标位置对象,如果没有查找到,结束遍历。
6.根据权利要求2所述的方法,其特征在于,所述在所述第二位置链表内的位置对象中,确定出具有与所述目标代码块的名称属性相对应的描述信息的目标位置对象,包括:
在所述第二位置链表内的位置对象中,基于所述描述信息所表征的所述位置对象之间的嵌套关系信息,建立树形结构,所述树形结构包括至少一层节点,所述节点为所述第二位置链表内的位置对象;
遍历所述树形结构中的节点,以确定具有与所述目标代码块的名称属性相对应的描述信息的目标位置对象。
7.根据权利要求6所述的方法,其特征在于,所述遍历所述树形结构中的节点,以确定具有与所述目标代码块的名称属性相对应的描述信息的目标位置对象,包括:
从所述树形结构中的第一层节点对应的位置对象开始,比对当前遍历深度与所述目标代码块的路径目标深度;
如果所述当前遍历深度与所述路径目标深度相同且均为1,在所述当前层的位置对象中,基于所述当前层的位置对象的描述信息,查找与所述目标代码块的名称属性相匹配的描述信息的目标位置对象,如果没有查找到,结束遍历;
如果所述当前遍历深度小于所述路径目标深度,在所述当前层的位置对象中,查找具有与所述目标代码块的完整路径相匹配的描述信息的命中位置对象,如果查找到,将所述当前遍历深度加1并将所述命中位置对象所嵌套的下一层作为当前层,返回执行所述比对当前遍历深度与所述目标代码块的路径目标深度的步骤,如果没有查找到,结束遍历;
如果所述当前遍历深度与所述路径目标深度相同且不为1,在所述当前层的位置对象中,基于所述当前层的位置对象的描述信息,查找具有与所述目标代码块的名称属性相匹配的描述信息的目标位置对象,如果没有查找到,结束遍历。
8.一种代码定位装置,其特征在于,包括:
接收单元,用于接收定位请求指令,所述定位请求指令至少包括待定位的目标代码块的至少一个属性信息;
获得单元,用于响应于所述定位请求指令,获得所述目标代码块所属的代码文件的第一位置链表,其中,所述第一位置链表中包括至少一个位置对象,所述位置对象中包括其对应的代码块的描述信息;
确定单元,用于在所述第一位置链表内的位置对象中,确定目标位置对象,所述目标位置对象具有与所述目标代码块的属性信息相对应的描述信息;
位置获取单元,用于基于所述目标位置对象的描述信息,获得所述目标代码块在所述代码文件中的位置信息。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910317165.4A CN110032366B (zh) | 2019-04-19 | 2019-04-19 | 一种代码定位方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910317165.4A CN110032366B (zh) | 2019-04-19 | 2019-04-19 | 一种代码定位方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110032366A true CN110032366A (zh) | 2019-07-19 |
CN110032366B CN110032366B (zh) | 2022-07-22 |
Family
ID=67239189
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910317165.4A Active CN110032366B (zh) | 2019-04-19 | 2019-04-19 | 一种代码定位方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110032366B (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112800194A (zh) * | 2021-01-15 | 2021-05-14 | 亿企赢网络科技有限公司 | 一种接口变更识别方法、装置、设备及存储介质 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102122285A (zh) * | 2010-01-11 | 2011-07-13 | 卓望数码技术(深圳)有限公司 | 一种数据缓存系统和数据查询方法 |
US20140325531A1 (en) * | 2009-08-13 | 2014-10-30 | Google Inc. | Location-dependent, server side macro method, apparatus and computer readable medium |
US20150020045A1 (en) * | 2013-03-08 | 2015-01-15 | Tencent Technology (Shenzhen) Company Limited | Method, device and computer-readable storage medium for closure testing |
CN107463676A (zh) * | 2017-08-04 | 2017-12-12 | 杭州安恒信息技术有限公司 | 文本数据存储方法及装置 |
CN109213699A (zh) * | 2018-09-21 | 2019-01-15 | 郑州云海信息技术有限公司 | 一种元数据管理方法、系统、设备及计算机可读存储介质 |
-
2019
- 2019-04-19 CN CN201910317165.4A patent/CN110032366B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20140325531A1 (en) * | 2009-08-13 | 2014-10-30 | Google Inc. | Location-dependent, server side macro method, apparatus and computer readable medium |
CN102122285A (zh) * | 2010-01-11 | 2011-07-13 | 卓望数码技术(深圳)有限公司 | 一种数据缓存系统和数据查询方法 |
US20150020045A1 (en) * | 2013-03-08 | 2015-01-15 | Tencent Technology (Shenzhen) Company Limited | Method, device and computer-readable storage medium for closure testing |
CN107463676A (zh) * | 2017-08-04 | 2017-12-12 | 杭州安恒信息技术有限公司 | 文本数据存储方法及装置 |
CN109213699A (zh) * | 2018-09-21 | 2019-01-15 | 郑州云海信息技术有限公司 | 一种元数据管理方法、系统、设备及计算机可读存储介质 |
Non-Patent Citations (1)
Title |
---|
刘云龙: "基于Token的结构化匹配同源性代码检测技术研究", 《计算机应用研究》 * |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112800194A (zh) * | 2021-01-15 | 2021-05-14 | 亿企赢网络科技有限公司 | 一种接口变更识别方法、装置、设备及存储介质 |
CN112800194B (zh) * | 2021-01-15 | 2023-11-17 | 亿企薪福网络科技有限公司 | 一种接口变更识别方法、装置、设备及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN110032366B (zh) | 2022-07-22 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104216895B (zh) | 一种生成poi数据的方法及装置 | |
CN110222143B (zh) | 字符串匹配方法,装置,存储介质及电子设备 | |
CN102346747B (zh) | 在数据模型中查找参数的方法 | |
CN104537070A (zh) | 挖掘旅游目的地景点的方法和设备 | |
CN104778258B (zh) | 一种面向协议数据流的数据抽取方法 | |
CN110808883B (zh) | 一种光纤通信传输路径的搜索方法 | |
CN105787126A (zh) | k-d树生成方法和k-d树生成装置 | |
CN108710662A (zh) | 语言转换方法和装置、存储介质、数据查询系统和方法 | |
CN101110778A (zh) | 一种利用默认路由压缩路由转发表的方法 | |
US6847967B1 (en) | Information set importance determination system and information set importance determination method | |
CN105490830B (zh) | 一种网络拓扑图中查找环状结构的方法及系统 | |
US9674083B2 (en) | Path calculation order deciding method, program and calculating apparatus | |
CN110032366A (zh) | 一种代码定位方法及装置 | |
CN101035307B (zh) | 一种交换机中模糊号码分析的实现方法 | |
CN108694242A (zh) | 基于dom的节点查找方法、设备、存储介质及装置 | |
CN106951213A (zh) | 一种命令解析方法及装置 | |
JP6511793B2 (ja) | テストケース生成プログラム、テストケース生成方法及びテストケース生成装置 | |
CN110493058A (zh) | 网络拓扑结构的构建方法及装置、存储介质、终端 | |
CN112819160B (zh) | 一种神经网络模型的可视化方法、装置、设备及存储介质 | |
JP2020016984A (ja) | 軌跡検索装置及び軌跡検索プログラム | |
CN115098362A (zh) | 页面测试方法、装置、电子设备以及存储介质 | |
CN103823827A (zh) | 用于抓取富互联网应用的方法和装置 | |
CN106980653B (zh) | Dfa压缩方法及装置、正则表达式匹配方法及系统 | |
CN111198818A (zh) | 一种信息获取方法及装置 | |
JP4438392B2 (ja) | 木構造データ作成装置及びプログラム |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |