CN112817583A - 一种代码编辑方法、装置、服务端、用户设备及存储介质 - Google Patents
一种代码编辑方法、装置、服务端、用户设备及存储介质 Download PDFInfo
- Publication number
- CN112817583A CN112817583A CN202110418591.4A CN202110418591A CN112817583A CN 112817583 A CN112817583 A CN 112817583A CN 202110418591 A CN202110418591 A CN 202110418591A CN 112817583 A CN112817583 A CN 112817583A
- Authority
- CN
- China
- Prior art keywords
- data
- code
- editor
- candidate
- code data
- 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
Images
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
- G06F8/33—Intelligent editors
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/30—Information retrieval; Database structures therefor; File system structures therefor of unstructured textual data
- G06F16/33—Querying
- G06F16/3331—Query processing
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computational Linguistics (AREA)
- Data Mining & Analysis (AREA)
- Databases & Information Systems (AREA)
- Document Processing Apparatus (AREA)
Abstract
本申请实施例提供一种代码编辑方法、装置、服务端、用户设备及存储介质,其中方法包括:获取编辑器前端发送的数据补全请求,所述数据补全请求包括代码编辑界面实时的代码变更内容;根据所述代码变更内容,确定所述代码编辑界面实时输入的代码文档;将所述代码文档转化为语法树;根据所述语法树,解析所述代码文档中当前输入位置的部分代码数据,以及解析所述部分代码数据的数据类型;所述数据类型包括如下任一项:关键字、函数和元数据;所述元数据包括表、字段、库;根据所述数据类型,确定匹配所述部分代码数据的候选代码数据;将所述候选代码数据发送给编辑器前端进行展示。本申请实施例可支持多数据类型的数据补全,提升代码编辑效率。
Description
技术领域
本申请实施例涉及数据处理技术领域,具体涉及一种代码编辑方法、装置、服务端、用户设备及存储介质。
背景技术
代码编辑主要是由用户使用代码编辑器(简称编辑器)编辑代码数据,其广泛用于数据开发、编程等工作中。为提升代码编辑的效率,本领域技术人员一直在不断优化代码编辑器的功能。
发明内容
有鉴于此,本申请实施例提供一种代码编辑方法、装置、服务端、用户设备及存储介质。
第一方面,本申请实施例提供一种代码编辑方法,所述方法应用于编辑器服务端,所述方法包括:
获取编辑器前端发送的数据补全请求,所述数据补全请求包括代码编辑界面实时的代码变更内容;
根据所述代码变更内容,确定所述代码编辑界面实时输入的代码文档;
将所述代码文档转化为语法树;
根据所述语法树,解析所述代码文档中当前输入位置的部分代码数据,以及解析所述部分代码数据的数据类型;所述数据类型包括如下任一项:关键字、函数和元数据;所述元数据包括表、字段、库;
根据所述数据类型,确定匹配所述部分代码数据的候选代码数据;
将所述候选代码数据发送给编辑器前端进行展示。
第二方面,本申请实施例提供代码编辑方法,所述方法应用于编辑器前端,所述方法包括:
展示代码编辑界面;
向编辑器服务端发送数据补全请求,所述数据补全请求包括代码编辑界面实时的代码变更内容;
获取编辑器服务端基于代码编辑界面的当前输入位置的部分代码数据的数据类型,所反馈的候选代码数据,所述候选代码数据与所述部分代码数据相匹配;所述数据类型包括如下任一项:关键字、函数和元数据;所述元数据包括表、字段、库;
在所述代码编辑界面展示所述候选代码数据;
从所述候选代码数据中选择输入的目标代码数据。
第三方面,本申请实施例提供一种代码编辑装置,所述装置应用于编辑器服务端,所述装置包括:
数据补全请求获取模块,用于获取编辑器前端发送的数据补全请求,所述数据补全请求包括代码编辑界面实时的代码变更内容;
代码文档确定模块,用于根据所述代码变更内容,确定所述代码编辑界面实时输入的代码文档;
语法树转化模块,用于将所述代码文档转化为语法树;
解析模块,用于根据所述语法树,解析所述代码文档中当前输入位置的部分代码数据,以及解析所述部分代码数据的数据类型;所述数据类型包括如下任一项:关键字、函数和元数据;所述元数据包括表、字段、库;
候选代码数据确定模块,用于根据所述数据类型,确定匹配所述部分代码数据的候选代码数据;
数据发送模块,用于将所述候选代码数据发送给编辑器前端进行展示。
第四方面,本申请实施例提供一种代码编辑装置,所述装置应用于编辑器前端,所述装置包括:
编辑界面展示模块,用于展示代码编辑界面;
请求发送模块,用于向编辑器服务端发送数据补全请求,所述数据补全请求包括代码编辑界面实时的代码变更内容;
候选代码数据获取模块,用于获取编辑器服务端基于代码编辑界面的当前输入位置的部分代码数据的数据类型,所反馈的候选代码数据,所述候选代码数据与所述部分代码数据相匹配;所述数据类型包括如下任一项:关键字、函数和元数据;所述元数据包括表、字段、库;
候选代码数据展示模块,用于在所述代码编辑界面展示所述候选代码数据;
选择输入模块,用于从所述候选代码数据中选择输入的目标代码数据。
第五方面,本申请实施例提供一种编辑器服务端,包括至少一个存储器和至少一个处理器,所述存储器存储一条或多条计算机指令,所述处理器调用所述计算机指令以实现如上述第一方面所述的代码编辑方法。
第六方面,本申请实施例提供一种用户设备,所述用户设备运行有编辑器前端,所述用户设备包括至少一个存储器和至少一个处理器,所述存储器存储一条或多条计算机指令,所述处理器调用所述计算机指令以实现如上述第二方面所述的代码编辑方法。
第七方面,本申请实施例提供一种存储介质,所述存储介质存储一条或多条计算机指令,所述计算机指令被执行时实现如上述第一方面所述的代码编辑方法,或者,如上述第二方面所述的代码编辑方法。
本申请实施例提供的代码编辑方案中,当编辑器前端在代码编辑界面编辑代码的过程中,编辑器服务端可获取代码编辑界面实时输入的代码文档。编辑器服务端可将该代码文档转化为语法树,及根据所述语法树解析出该代码文档中当前输入位置的部分代码数据,以及该部分代码数据的数据类型。编辑器服务端可基于解析的数据类型,确定匹配该部分代码数据的候选代码数据。所述数据类型包括如下任一项:关键字、函数和元数据;所述元数据包括表、字段、库。从而,编辑器服务端再将该候选代码数据反馈给编辑器前端进行展示,则可使得用户从编辑器前端展示的候选代码数据中选择需要输入的目标代码数据,达成代码数据的补全和推荐。可见,本申请实施例可基于编辑器服务端实现数据补全功能,编辑器服务端可通过语法树解析,确定出代码编辑界面当前输入位置的部分代码数据的数据类型,并基于数据类型自适应的实现匹配该部分代码数据的数据补全,达到支持多数据类型的数据补全的效果。因此,本申请实施例提供的代码编辑方案可支持多数据类型的数据补全,提升代码的编辑效率。
附图说明
为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
图1a为编辑器系统的示意图。
图1b为编辑器前端实现的流程图。
图2为本申请实施例提供的代码编辑方法的流程图。
图3a为关键字的数据补全的逻辑流程图。
图3b为智能排序模型的离线训练和在线预测的流程图。
图3c为代码编辑界面展示候选关键字的示意图。
图3d为代码编辑界面展示候选函数的示意图。
图4a为元数据名称和数据获取接口的定义示例图。
图4b为元数据的数据补全的逻辑流程图。
图4c为代码编辑界面展示候选表的示例图。
图4d为代码编辑界面展示候选库和候选表的示意图。
图4e为表的别名以及子查询穿透的示意图。
图5a为算法推荐的离线学习训练和在线预测的流程图。
图5b为代码编辑界面展示预测的代码片段的示例图。
图5c为基于多个token特征预测代码片段的示意图。
图6a为批量补全代码数据的示意图。
图6b为可视化批量补全代码数据的实现流程图。
图6c为悬停提示的示意图。
图6d为悬停提示的实现逻辑流程图。
图7a为提取光标所在位置的表的示意图。
图7b为提取整个代码文档的表的示意图。
图7c为表的血缘关系图。
图7d为文件树的示意图。
图7e为元数据平台的表详情页面的跳转示意图。
图7f为展示库下的表的示意图。
图8a为基于历史输入的候选代码数据的推荐示意图。
图8b为推荐模型的训练流程图。
图8c为推荐模型的预测流程图。
图8d为用户进行个性化配置的页面的示意图。
图8e为个性化配置的实现流程图。
图9a为本申请实施例提供的代码编辑装置的框图。
图9b为编辑器服务端的框图。
图9c为本申请实施例提供的代码编辑装置的另一框图。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
在代码编辑的过程中,编辑器可基于用户当前输入的部分代码数据,提示匹配该部分代码数据的一个或多个候选代码数据,以便用户从候选代码数据中选择当前输入的目标代码数据,提升用户使用编辑器编辑代码的效率。这种功能称为编辑器的数据补全功能。
编辑器的数据补全功能可由编辑器用户端实现(编辑器用户端也可称为编辑器前端),也可由编辑器服务端实现。编辑器前端可以认为是用户设备上以网页、应用程序等形式运行的编辑器工具。编辑器服务端可以认为是提供编辑器服务能力的服务器设备。
在编辑器前端实现数据补全功能的方案中,编辑器前端可存储用于数据补全的配置文件,该配置文件可以例如代码数据库,或者,该配置文件可以记录用户历史习惯编辑的代码数据。编辑器前端可在用户编辑代码的过程中,通过解析配置文件,来提示匹配用户输入的部分代码数据的候选代码数据。例如,编辑器提供网页形式的代码编辑界面的情况下,编辑器前端可在网页加载阶段,将配置文件由编辑器服务端加载到编辑器前端,进而编辑器前端运行JavaScript等编程语言,来基于用户输入的部分代码数据解析配置文件,实现数据补全功能。
编辑器前端实现数据补全功能的方案的缺点在于:运算的效能完全取决于用户设备的机器能力,若用户设备的机器能力较差,则可能导致数据处理能力较差,影响代码编辑效率。另外,由于需要将配置文件由编辑器服务端加载到编辑器前端,这在配置文件的数据量较大时,可能导致配置文件的加载时长变长,使得代码编辑的准备工作需要耗费较长时间,影响代码编辑效率。因此,以编辑器前端实现数据补全功能需要尽量限制数据补全涉及的数据量和类型,这可以使配置文件的数据大小控制在一定量级,同时不会造成编辑器前端过多的资源损耗,但代价是编辑器前端所能实现的数据补全能力有限。并且这种编辑器往往只能针对特定的某一种(或者某一类型)语言提供代码编辑能力,要再想支持其它语言就需要耗费人力做定制开发。
在编辑器服务端实现数据补全功能的方案中,可由编辑器服务端基于用户当前输入的部分代码数据,推荐匹配该部分代码数据的一个或多个候选代码数据,并将候选代码数据推送到编辑器前端,以由用户从候选代码数据中选择当前输入的目标代码数据。
编辑器服务端实现数据补全功能的方案可将数据补全的处理工作放置在服务器设备,避免了编辑器前端实现数据补全带来的问题,但是编辑器服务端实现数据补全功能的方案也存在需要优化的问题:编辑器服务端能够实现数据补全的数据类型较少,如何支持多类型的数据补全一直是亟需解决的问题。
另外,如果不合理的选用编辑器服务器与编辑器前端的通信协议,也会对数据补全功能存在影响。例如,编辑器服务器与编辑器前端使用http(HyperText TransferProtocol,超文本传输协议)协议进行通信,则编辑器前端会在代码编辑过程中一直向编辑器服务端发送http请求,以便获得编辑器服务端反馈的候选代码数据。由于http请求容易达到并发上限并且http请求的包头比较大,这极易造成网络延迟增大,导致http请求的发送阻塞或编辑器服务端响应http请求不及时,影响代码编辑效率。另外,编辑器服务端如何实现编辑器支持多种语言,也是需要进一步解决的问题。
本申请实施例提供了一种编辑器系统,该编辑器系统可由编辑器服务端实现数据补全功能。在一些实施例中,图1a示出了编辑器系统100的可选示意图。如图1a所示,编辑器系统100可以包括:编辑器前端110和编辑器服务端120。
在一些实施例中,编辑器前端110和编辑器服务端120可基于websocket进行实时通信,以处理编辑器前端110和编辑器服务端120之间的高频交互。websocket可以认为是一种在单个TCP(Transmission Control Protocol,传输控制协议)连接上进行全双工通信的协议。
在编辑器前端的实现上,编辑器前端需要实现与编辑器服务端的通信、语言服务注册、页面渲染、和服务使用等能力。作为一种可选实现中,图1b示出了编辑器前端实现的流程图。当用户在用户设备上新建某一语言的编辑器时,可执行图1b所示流程。如图1b所示,该流程可以包括如下步骤。
在步骤S111中,编辑器前端建立与编辑器服务端的websocket通道,搭建与编辑器服务端的RPC(Remote Procedure Call,远程过程调用)通信基础设施。
在步骤S112中,编辑器前端向编辑器服务端请求初始化指定语言的服务。
在步骤S113中,编辑器前端基于编辑器服务端反馈的语言服务的支持能力,进行该语言的服务初始化配置。
在步骤S114中,在编辑器前端和编辑器服务端完成该语言的服务初始化后,编辑器前端为该语言注册语言服务支持的编辑能力和语法配置。
在步骤S115中,编辑器前端创建编辑器实例,为该编辑器实例注册该语言。
编辑器前端创建编辑器实例,并为该编辑器实例注册该语言后,用户可使用该编辑器实例,以该语言编辑代码。
在步骤S116中,编辑器前端为编辑器实例注册交互事件。
交互事件可以是用户与编辑器实例之间交互的事件。
在步骤S117中,编辑器前端渲染编辑器实例对应的界面。
编辑器实例对应的界面可被渲染到编辑器前端进行显示,以便用户可在编辑器实例对应的界面,进行代码编辑。
在步骤S118中,当用户编辑代码的过程中,若用户的操作触发预定义事件,编辑器前端使用相应服务,响应用户需求。
在步骤S118的一些实施例中,当用户在编辑器实例的代码编辑界面,使用注册的语言编辑代码的过程中,如果用户的操作触发预定义事件,则编辑器前端可调用编辑器服务端提供的服务,实现相应功能。例如,当用户在编辑器实例的代码编辑界面,输入部分代码数据时,编辑器前端可调用编辑器服务端提供的数据补全服务,获取到匹配该部分代码数据的候选代码数据,以提示用户从候选代码数据中选择目标代码数据,实现数据补全功能。
在编辑器服务端的实现上,编辑器服务端需要实现与编辑器前端的消息收发、语言服务支持、语法树解析、服务处理等能力。在一些实施例中,编辑器服务端的实现过程可以如下。
(1)编辑器服务端需要具备实现通信的代理层(例如具有RPC通信的websocket代理层),以实现与编辑器前端的消息接收、消息发送。例如,本申请实施例可使用Netty作为实现websocket的原始框架,用RxJava将Netty所接收到的消息作为发射源,同时创建一个接受源来处理所有结果的返回,将接受消息与发送消息分离开。Netty是一个java开源框架,提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。RxJava是一个异步框架,其特点是链式调用、逻辑简单。
(2)编辑器服务端需要为语言服务支持的编辑能力,构建对应的语法执行服务,实现语法、词法解析SDK(Software Development Kit,软件开发工具包)的核心逻辑。
(3)编辑器服务端在收到编辑器前端的语言服务初始化请求时,需要返回目前支持的编辑能力,然后进行初始化语言服务。
(4)编辑器服务端需要根据编辑器前端实时输入的代码文档,转化得到语法树。例如,编辑器前端可借助ANTLR提供的RunTime API,根据当前语言的ANTLR4词法和语法配置文件,将代码文档转化为符合ANTLR元语言规则的语法树。ANTLR是可以根据输入自动生成语法树并可视化的显示出来的开源语法分析器。ANTLR4是一款开源的语法分析器生成工具,能够根据语法规则文件生成对应的语法分析器。
(5)编辑器服务端在收到编辑器前端的服务请求时,可根据语法树解析编辑器前端的当前输入位置(例如当前光标位置)的数据、数据类型、具体位置等信息(针对比较复杂的服务请求,还可能需要解析出代码文档的上下文),然后根据不同的服务请求,调用不同的服务,得到请求结果并返回给编辑器前端。例如,针对数据补全功能,编辑器服务端可根据语法树解析编辑器前端的当前输入位置的部分代码数据的数据类型,从而基于数据类型调用相应的数据补全逻辑,确定与数据类型下与该部分代码数据匹配的候选代码数据,将候选代码数据反馈给编辑器前端。
在一些实施例中,编辑器前端与编辑器后端可以采用websocket 协议。websocket协议具有如下优势:能够实现双向通信、节约网络开销,具有比 http 更强的扩展性,并能够支持数据压缩,同时又具有状态连接等特性。
在一些实施例中,编辑器前端与编辑器服务端之间的传输数据,可基于 RPC协议(例如,json-RPC协议)进行包装。同时将传输数据的消息头部去掉,利用其比 http 更精简的特性,能够实现编辑器前端与编辑器服务端进行更少数据量数据传输,减少编辑器服务端的压力。
在一些实施例中,编辑器前端与编辑器服务端之间的数据传输格式,可以采用LSP(Language Server Protocol,语言服务器协议)。LSP是一套描述编辑行为与语言特性的统一协议,该协议能够解耦编辑器前端与编辑器服务端的语言服务。通过定义一套统一的数据通信协议(例如LSP),可使得采用该协议的编辑器可以对接,各种同样基于该协议实现的语言服务。
下面以一个示例,介绍编辑器前端与编辑器服务端的通信实现机制。
(1)编辑器前端与编辑器服务端各自基于websocket实现RPC机制。
编辑器前端将待传输数据转成LSP协议格式,将待传输数据基于json-rpc协议进行包装,并将消息头部去掉;编辑器服务端使用Netty作为实现websocket的原始框架,用RxJava将Netty所接收到的消息作为发射源,同时创建一个接受源来处理所有结果的返回,将接受消息与发送消息分离开。
(2)根据编辑器与语言服务器的交互,制定一套公共的流程,保证每个语言实现LSP 协议后,编辑器只需调用不同的语言服务(Language Server),即可支持不同语言特性。
(3)编辑器前端与编辑器服务端各自接收到消息后,进行消息类型的判定,并执行不同的流程。如果是通知或响应类的消息,执行具体的操作即可;如果是请求类的消息,需要处理请求并将请求处理结果进行返回。
需要说明的是,上述编辑器前端和编辑器服务端的实现手段仅是一种可选实现手段。本申请实施例也可支持其他可能的编辑器前端和编辑器服务器实现手段。例如,编辑器前端和编辑器服务器也可不限于websocket通信,编辑器服务器也可不限于ANTLR技术生成语法树等。
在实现编辑器前端和编辑器服务端后,本申请实施例提供基于编辑器服务端实现数据补全功能的代码编辑方案。图2示出了本申请实施例提供的代码编辑方法的流程图。参照图2,该流程可以包括如下步骤。
在步骤S211中,编辑器前端展示代码编辑界面。
编辑器前端实现后,编辑器前端可展示用于用户编辑代码的代码编辑界面。用户可在该代码编辑界面中输入代码。
在步骤S212中,当代码编辑界面输入或修改字符后,编辑器前端向编辑器服务端发送数据补全请求,该数据补全请求包括代码编辑界面实时的代码变更内容。
在步骤S213中,编辑器服务端根据所述代码变更内容,确定编辑器前端在代码编辑界面实时输入的代码文档。
步骤S212和步骤S213可以认为是编辑器服务端确定编辑器前端在代码编辑界面实时输入的代码文档的可选过程。在一些实施例中,编辑器前端在编辑代码前,可打开初始代码文档并将该初始代码文档同步给编辑器服务端。在编辑器前端编辑代码的过程中,如果代码编辑界面存在新输入的字符或者修改的字符,则编辑器前端可通过websocket通信向编辑器服务端发送实时的代码变更内容。从而,编辑器服务器端可根据初始代码文档以及实时的代码变更内容,拼装出编辑器前端在代码编辑界面实时输入的代码文档。
在步骤S214中,编辑器服务器端将所述代码文档转化为语法树。
在一些实施例中,编辑器服务端可根据编辑器前端使用的当前语言的Antlr4词法和语法配置文件,将所述代码文档转化为符合ANTLR元语言规则的语法树。
在步骤S215中,编辑器服务器根据所述语法树,解析所述代码文档中当前输入位置的部分代码数据,以及解析所述部分代码数据的数据类型。
在步骤S216中,编辑器服务器根据所述数据类型,确定匹配所述部分代码数据的候选代码数据。
在本申请实施例中,编辑器服务端支持数据补全的数据类型可以包括:关键字、函数和元数据等。元数据可以包括表、字段、库等。
关键字是指电脑语言里事先定义的,有特别意义的标识符,有时又叫保留字。函数是指一段可以直接被另一段程序或另一段代码引用的程序或代码,也叫做子程序。元数据(Metadata),又称中介数据、中继数据,为描述数据的数据(data about data),主要是描述数据属性(property)的信息,用来支持如指示存储位置、历史数据、资源查找、文件记录等功能。库是指数据库,数据库是存放数据的仓库。表是数据库中用来存储数据的对象,是有结构的数据的集合,是数据库的基本元素。字段代表一个成员,它表示与对象或类关联的变量。在数据库中,一般情况下,表的列称为字段,每个字段匹配某一专题的信息。例如,通讯录数据库中姓名、联系电话这些都是表中所有行共有的属性,所以把这些列称为姓名字段和联系电话字段。
在一些实施例中,本申请实施例可设置不同数据类型的检测逻辑(例如,关键字的检测逻辑、函数的检测逻辑、元数据的检测逻辑),通过设置不同数据类型的检测逻辑的调用顺序(例如依序调用顺序,并行调用顺序等),来检测所述部分代码数据的数据类型。如果所述部分代码数据与某一数据类型的检测逻辑相匹配,则可确定出所述部分代码数据匹配的数据类型。
在可选实现中,本申请实施例设置的不同数据类型的检测逻辑可以包括第一数据类型相应的检测逻辑,和第二数据类型相应的检测逻辑。第一数据类型不同于第二数据类型,例如,第一数据类型为关键字,第二数据类型为函数或元数据等。在一些实施例中,本申请实施例可预先设置各数据类型的检测逻辑的调用顺序,例如第一数据类型相应的检测逻辑的调用顺序,提前于第二数据类型相应的检测逻辑的调用顺序。从而,本申请实施例可先根据第一数据类型相应的检测逻辑以及所述语法树,检测所述部分代码数据的数据类型是否为第一数据类型,若否,则再调用第二数据类型相应的检测逻辑,以根据所述第二数据类型相应的检测逻辑以及所述语法树,检测所述部分代码数据的数据类型是否为第二数据类型。在一个示例中,本申请实施例可先检测所述部分代码数据的数据类型是否为关键字(例如第一数据类型为关键字),在检测所述部分代码数据的数据类型不为关键字时,再检测所述部分代码数据的数据类型是否为函数或元数据(例如第二数据类型为函数或元数据)。
当然,本申请实施例也可支持先检测所述部分代码数据的数据类型是否为函数或元数据,再在检测结果为否时,检测所述部分代码数据的数据类型是否为关键字。例如,在检查到解析语法树后的部分代码数据之前的字符为调用元数据的表、字段等设定字符时,可先进行元数据的类型检测,再进行其他类型的数据检测。需要说明的是,所述第一数据类型的具体形式、第二数据类型的具体形式、以及第一数据类型的检测逻辑的调用顺序、第二数据类型的检测逻辑的调用顺序,可根据实际情况设置,本申请实施例并不设限。例如,优先检测的数据类型(如第一数据类型)可根据实际情况设置,本申请实施例并不设限。
在一些实施例中,编辑器服务端可设置关键字的数据补全逻辑、函数的数据补全逻辑、元数据的数据补全逻辑(元数据的数据补全服务可以进一步具体包括:表的数据补全逻辑、字段的数据补全逻辑、库的数据补全逻辑)。从而,编辑器服务端在根据所述语法树,确定出代码文档中当前输入位置的部分代码数据的数据类型具体是关键字、函数、还是元数据(元数据可以具体细分为表、字段、库)后,可基于该数据类型相应的数据补全逻辑,确定出匹配该部分代码数据的候选代码数据,以实现为编辑器前端提供数据补全功能。
在步骤S217中,编辑器服务器将所述候选代码数据发送给编辑器前端。
在步骤S218中,编辑器前端在代码编辑界面展示所述候选代码数据。
基于编辑器前端在代码编辑界面展示的候选代码数据,用户可从候选代码数据中选择输入的目标代码数据,以在代码编辑界面提示候选代码数据的情况下,高效快捷的输入代码数据,提升代码编辑效率。
下面对实现关键字的数据补全功能进行说明。编辑器服务端可在确定代码编辑界面的当前输入位置的部分代码数据的数据类型为关键字时(即该部分代码数据为部分关键字),调用关键字的数据补全逻辑,确定出匹配该部分关键字的候选关键字。在一些实施例中,本申请实施例可先检测所述部分代码数据的数据类型是否为关键字,例如上述第一数据类型可以为关键字。
在一些实施例中,所述部分代码数据的数据类型是否为关键字可基于语法诊断实现。图3a示出了关键字的数据补全的逻辑流程图。参照图3a,该流程可以包括如下步骤。
在步骤S311中,遍历语法树进行语法诊断。
在步骤S312中,获取语法诊断结果,所述语法诊断结果包括代码文档中错误对象的syntax error(语法误差)以及错误提示,所述错误对象包括代码文档中当前输入位置的部分代码数据。
在步骤S313中,若所述部分代码数据的错误提示为缺少关键字,则确定所述部分代码数据的数据类型为关键字。
通过遍历语法树进行语法诊断,可对代码文档的上下文进行语法诊断,检查出代码文档中所有的错误对象的syntax error(语法误差)。该错误对象包括代码文档中当前输入位置的部分代码数据。语法诊断的语法诊断结果除提供代码文档中具有语法误差的错误对象外,还可提供错误对象的错误提示。如果当前输入位置的部分代码数据的错误提示是缺少关键字,则本申请实施例可确定该代码数据的数据类型为关键字。
进一步,如图3a所示,在步骤S314中,根据所述部分代码数据的错误提示,确定与所述部分代码数据相匹配的候选关键字。
在实现关键字的数据补全层面,在一些实施例中,本申请实施例可基于部分代码数据的错误提示,确定与该部分代码数据相匹配的候选关键字。例如,该部分代码数据的错误提示可以提示该部分代码数据可能匹配的正确的候选关键字。进一步,本申请实施例还可在编辑器服务端的配置中心设置关键字,从该部分代码数据的错误提示提示的关键字中(由语法诊断服务提供),过滤掉没有在配置中心设置的关键字,得到匹配该部分代码数据的候选关键字。
在一些实施例中,语法诊断可基于ANTLR实现,从而编辑器服务端可根据ANTLR运行时库的错误提示,从错误提示中解析出与所述部分代码数据匹配的候选关键字,或者,再进一步过滤没有在配置中心设置的关键字,得到候选关键字。
在一些实施例中,关键字的数据补全可是基于上下文解析后,给出当前需要的候选关键字进行动态提示,以避免无效提示。
编辑器服务端确定候选关键字后,可对候选关键字进行智能算法排序,将用户选择概率大的候选关键字排序在前,以方便用户从候选关键字中选择输入的目标关键字。在一些实施例中,编辑器服务端可借助机器学习模型,使用训练数据,训练得到智能排序模型,然后利用智能排序模型对候选关键字进行排序。本申请实施例针对SQL(StructuredQuery Language,结构化查询语言)这类半结构化语言,可采用Markov概率模型的方案,构建智能排序模型。在一些实施例中,智能排序模型可采用离线训练方式进行训练,并以在线方式预测候选关键字的排序。图3b示出了智能排序模型的离线训练过程320和在线预测过程340可进行参照。
离线训练过程320可以分为训练数据准备过程321和训练过程322。在训练数据准备过程321中,针对离线历史代码可根据关键字列表进行数据清理和分词,形成结构化的训练数据。在一些实施例中,antlr4中存在具有SQL语言的关键字列表,可以用来进行数据清理和分词,从而只保留关键字和固定模式(例如{bizdate})等高频常见样式,形成结构化的训练数据。该结构化的训练数据可添加例如start(开始)、end(结束)、unknown(未知)等标记,完成训练数据的准备。
在训练过程322中,以采用Markov概率模型实现智能排序模型为例,本申请实施例可加载Markov模型结构。使用N-gram等方式提取训练数据的特征,基于提取的特征对Markov模型结构进行训练,得到训练的智能排序模型。训练得到的智能排序模型可离线评估训练的效果,并在评估效果合格后导出模型文件。其中,Markov(马尔可夫)概率模型是一种统计模型,广泛应用在语音识别,词性自动标注,音字转换,概率文法等各个自然语言处理等应用领域。
在线预测过程340可以分为初始化过程341和预测过程342。在初始化过程341中,编辑器服务端可加载智能排序模型的配置文件并读取模型文件,从而加载智能排序模型。在预测过程342中,候选关键字可序列化输入智能排序模型,从而智能排序模型可预测各候选关键字的打分,并输出各候选关键字的打分,基于各候选关键字的打分确定各候选关键字的排序。例如,候选关键字的打分越高,则候选关键字的排序越靠前。
编辑器前端在确定与代码编辑界面的当前输入位置的部分关键字,相匹配的候选关键字,并确定候选关键字的排序后,可将包含该排序的候选关键字反馈给编辑器前端。编辑器前端可在代码编辑界面中以弹窗、下拉窗口等展示形式,展示具有该排序的候选关键字。图3c示出了代码编辑界面展示候选关键字的示意图。如图3c所示,与当前输入位置的部分关键字“w”相匹配的候选关键字,以下拉窗口的形式展示在代码编辑界面。在图3c中,如果按照字典的顺序进行排序,则when 会排序在 where 前面,而基于智能排序模型对候选关键字进行排序后,where会比when更加适合当前的代码编辑场景和上下文,更加方便用户从候选关键字中选择输入的目标关键字。
下面对实现函数的数据补全功能进行说明。编辑器服务端在确定代码编辑界面的当前输入位置的部分代码数据的数据类型为函数时(即该部分代码数据为部分函数),可调用函数的数据补全逻辑,确定出匹配该部分函数的候选函数。在一些实施例中,本申请实施例可在检测所述部分代码数据的数据类型不为第一数据类型(例如关键字)时,检测所述部分代码数据的数据类型是否为函数,例如上述第二数据类型可以为函数。
本申请实施例支持数据补全的函数可以包括编辑器当前使用语言的系统内置函数和自定义UDF(User-Defined Function,用户定义函数)函数。编辑器服务端在确定与当前输入位置输入的部分函数相匹配的候选函数后,可将所述候选函数反馈给编辑器前端,以便编辑器前端在代码编辑界面中展示候选函数。图3d示出了代码编辑界面展示候选函数的示意图。
在一些实施例中,本申请实施例可根据语法树,判断代码编辑界面的当前输入位置之前的节点,是否为预设的推荐函数的节点,若是,则可确定当前输入位置的部分代码数据的数据类型为函数。在进一步的可选实现中,本申请实施例可认为代码文档中能够推荐字段(元数据的一种类型)的节点,也可以推荐函数。因此如果代码编辑界面的当前输入位置之前的节点为预设的推荐字段的节点,则本申请实施例也可确定该节点为预设的推荐函数的节点。例如,当前输入位置之前的节点为下面这些节点时,本申请实施例可进行函数推荐,即本申请实施例可在这些节点之后推荐函数:“select”、“where”、“having”、“on”、“orderby”、“partitionedby”、“distibuteby”、“sortby”、“groupby”。也就是说,如果解析到当前输入位置之前的字符节点为上述预设的推荐函数的节点,则编辑器服务端可获取匹配到当前输入位置输入的部分函数的函数列表,该函数列表可包括多个候选函数。
如图3d所示,代码编辑界面的当前输入位置的部分代码数据“a”之前的节点为“select”,则该部分代码数据的数据类型为函数,代码编辑界面可通过下拉窗口的形式展示与该部分函数“a”相匹配的函数列表,该函数列表可包括与该部分函数“a”相匹配的候选函数。
在进一步的一些实施例中,本申请实施例也可支持训练智能排序模型,对候选函数进行排序。该智能排序模型的训练过程与前文描述同理实现,可相互参照。
需要说明的是,每门语言对应的函数类别和UDF函数列表是有规定的,因此可根据编辑器使用的语言,匹配推荐函数的节点和函数列表。
需要说明的是,关键字和函数的数据补全属于两种不同的方案。由于推荐字段(元数据的一种类型)的节点后,也可以推荐函数。因此函数的数据补全方案和元数据的数据补全方案可以相类似,例如,两种都可以遵循自定义规则实现数据补全。因此,函数的数据补全方案可以参照下文描述的元数据的数据补全方案进行实现。
下面对实现元数据的数据补全功能进行说明。编辑器服务端在确定代码编辑界面的当前输入位置的部分代码数据的数据类型为元数据时(即该部分代码数据为部分元数据),可调用元数据的数据补全逻辑,确定出匹配该部分元数据的候选元数据。在一些实施例中,本申请实施例可在检测所述部分代码数据的数据类型不为第一数据类型(例如关键字)时,检测所述部分代码数据的数据类型是否为元数据,例如上述第二数据类型可以为元数据。
元数据的数据补全属于自定义规则的数据补全,即本申请实施例可通过自定义规则来实现元数据的数据补全,元数据的数据补全可以是针对非关键字的补全需求。例如ODPS(Open Data Processing Service,开发数据处理服务)中table(表)的补全提示就属于自定义的数据补全。
在一些实施例中,业务方可在配置中心定义好ODPS所有扩展的元数据名称,以及自定义的元数据名称对应的数据获取接口。在一个示例中,图4a示例了元数据名称和对应的数据获取接口,可进行参照。在确定代码编辑界面的当前输入位置的部分代码数据的数据类型为元数据之后,编辑器服务端可基于元数据名称和对应的数据获取接口,实现元数据补全。图4b示出了元数据的数据补全的逻辑流程图。参照图4b,该流程可以包括如下步骤。
在步骤S411中,判断当前输入位置的部分代码数据是否符合元数据名称,若是,执行步骤S412,若否,结束流程。
当前输入位置的部分代码数据可通过解析代码文档的语法树确定,例如,将代码文档转化为语法树后,可解析语法树,定位到当前输入位置的字符节点(例如当前输入位置的部分代码数据)。
在步骤S412中,根据自定义的所述元数据名称对应的数据获取接口,获取与所述部分代码数据相匹配的候选元数据。
在一个例子中,以用户输入“SELECT * FROM q”为例,该输入内容中当前输入位置的部分代码数据“q”的数据类型为元数据(具体为元数据中的表),则编辑器服务端可遍历语法树,判断该部分代码数据“q”是否符合ANTLR语法中的表名称。如果当前输入位置的“q”与元数据中的“tableName(表名)”相符合,则编辑器服务端可调用自定义的该表名对应的数据获取接口(例如,数据获取接口可由统一资源标示符URI表示),从元数据中心获取与部分代码数据“q”相匹配的表的列表,作为候选表,返回给编辑器前端进行展示。
元数据中字段、库的数据补全逻辑与上述说明类似,可相互参照。例如,在确定代码编辑界面当前输入位置的部分代码数据的数据类型为字段时,编辑器服务端可判断当前输入位置的部分代码数据是否符合ANTLR语法中的字段名称,若是,则编辑器服务端可调用自定义的该字段名称对应的数据获取接口,从元数据中心获取与该部分代码数据相匹配的字段,作为候选字段,返回给编辑器前端进行展示。也就是说,基于当前输入位置的部分代码数据的具体元数据类型和元数据名称,编辑器服务端可调取相应的数据获取接口,获取与该部分代码数据相匹配的候选元数据,以实现元数据补全。
在本申请实施例中,元数据可以细分为表、字段和库。在实现表的数据补全层面,编辑器服务端可根据语法树,判断当前输入位置的部分代码数据之前的代码字符是否为预设的调用表的字符,若是,则可确定该部分代码数据的元数据类型为表。预设的调用表的字符例如“from”等,具体可视编辑器使用的语言而言。在一种示例中,图4c示出了代码编辑界面展示候选表的示例图。如图4c所示,代码编辑界面的当前输入位置的部分代码数据“a”之前的字符为“from”,是预设的调用表的字符,因此部分代码数据“a”的数据类型为元数据中的表。在一些实施例中,表隶属于库,编辑器服务端可通过表的数据获取接口,从当前库中获取到与部分代码数据相匹配的表列表。也就是说,如果识别到当前需要补全表,会为用户推荐当前库下的表。
在实现字段的数据补全层面,编辑器服务端可根据语法树,判断代码编辑界面的当前输入位置之前的节点,是否为预设的推荐字段的节点,若是,则可确定当前输入位置的部分代码数据的数据类型为字段。预设的推荐字段的节点与前文描述的预设的推荐函数的节点类似,例如:“select”、“where”、“having”、“on”、“orderby”、“partitionedby”、“distibuteby”、“sortby”、“groupby”等。在一些实施例中,字段隶属于表,编辑器服务端可通过与该部分代码数据相符合的字段名对应的数据获取接口,从当前表中获取到候选字段;也就是说,如果识别到当前需要补全字段,会为用户推荐当前表下的字段(即,所述候选字段为属于当前表中的字段)。
在实现库的数据补全层面,多数数据源是不支持跨数据库的,但是MaxCompute(一项大数据计算服务)是一种特殊的引擎类数据源,它的表存放在项目空间(英文名为project),而且支持跨项目空间访问表。同时,写SQL时,如果需要访问其它项目空间的表,则需要填入其它项目空间;如果不输入项目空间,则系统自动识别使用当前项目空间。也就是说,对于MaxComput而言,库就是项目空间,同时可以跨项目空间使用表,因此在当前项目空间,需要推荐其他项目空间。
也就是说,库的补全与当前库下表的补全是同步的,库的数据补全层面的逻辑例如:在预设的调用表的字符(例如“from”)之后,根据输入的部分代码数据,推荐可以匹配到的库和当前库下的表。因此,在补全推荐MaxCompute的元数据时,需要补全库或表,这会为用户推荐到与用户当前输入的部分代码数据项匹配的全部候选库和当前库下的候选表,以供用户选择。图4d展示了代码编辑界面展示候选库和候选表的示意图。如图4d所示,用户在from之后,输入部分代码数据“au”,编辑器服务端可为编辑器前端推荐部分代码数据“au”匹配到的候选库和当前库下的候选表。可以理解的是,候选库中具有不同于所述当前库的库。
需要说明的是,对于其它非MaxCompute类型的语言,没有跨项目空间访问表的需求,因此针对其它语言可不进行库的补全。
在本申请进一步的一些实施例中,本申请实施例也可支持代码数据的别名补全,以及子查询穿透。代码数据的别名是指为表、字段、函数等代码数据定义的名称。代码数据的别名补全的原理与上文描述的数据补全的原理相似,例如,在识别当前输入位置的部分代码数据的数据类型后,编辑器服务器可在该数据类型下,确定与该部分代码数据匹配的代码数据的别名,并推荐给编辑器前端。子查询是一种常用计算机语言SELECT-SQL语言中嵌套查询下层的程序模块,当一个查询是另一个查询的条件时,称之为子查询。在一种示例中,图4e示出了表的别名以及子查询穿透的示意图,可进行参照。
本申请实施例提供的代码编辑方案中,当编辑器前端在代码编辑界面编辑代码的过程中,编辑器服务端可获取代码编辑界面实时输入的代码文档。编辑器服务端可将该代码文档转化为语法树,及根据所述语法树解析出该代码文档中当前输入位置的部分代码数据,以及该部分代码数据的数据类型。编辑器服务端可基于解析的数据类型,确定匹配该部分代码数据的候选代码数据。编辑器服务端再将该候选代码数据反馈给编辑器前端进行展示,则可使得用户从编辑器前端展示的候选代码数据中选择需要输入的目标代码数据,达成代码数据的补全和推荐。可见,本申请实施例可基于编辑器服务端实现数据补全功能,编辑器服务端可通过语法树解析,确定出代码编辑界面当前输入位置的部分代码数据的数据类型,并基于数据类型自适应的实现匹配该部分代码数据的数据补全,达到支持多数据类型的数据补全的效果。因此,本申请实施例提供的代码编辑方案可支持多数据类型的数据补全,提升代码的编辑效率。
在更为具体的可选实现中,本申请实施例支持数据补全的数据类型可以例如:关键字、函数、表、字段、库等。当然,这些数据类型仅是一些示例,本申请实施例也可通过预设其他不同数据类型的数据补全逻辑,以在识别该部分代码数据的数据类型后,通过调用相应的数据补全逻辑,实现该数据类型相应的数据补全。
在本申请进一步的一些实施例中,编辑器服务还可提供代码片段预测功能。代码片段预测是指根据用户在代码编辑界面已输入的代码内容,推荐用户后续可能需要输入的代码片段,从而为用户推荐整段的代码内容,减少用户的代码编辑工作量。在实现代码片段预测的层面,本申请实施例可提供两种预测方式。
一、基于代码关键词和自定义模板的预测方式,该预测方式可以快速配置编辑器所支持的语言。在该预测方式中,本申请实施例可预置代码关键词以及预置代码关键词对应的代码片段模板。从而,编辑器服务端可基于代码文档中的代码内容,确定与代码内容相匹配的预置代码关键词,推荐相匹配的预置代码关键词对应的代码片段模板,实现代码片段预测。
二、基于算法推荐的预测方式,该预测方式可根据代码库进行学习训练,并能够随着用户输入,实时推荐代码片段。
基于算法推荐的预测方式可以分为离线学习部分和在线预测部分。离线学习部分主是进行离线的代码库集处理,包括预处理,代码结构划分,构建代码结构树库等。离线学习部分可以在编辑器接入语言时可以一次性完成,不需要重复训练和加载模型,可以采用离线存储、加载的方式使用。在线预测部分包括对用户输入的代码文档的解析、提取代码文档中的关键词、使用预测模型匹配最佳的代码结构树,以及对代码结构树中的代码进行排序、转化为代码片段等。
图5a示出了算法推荐的离线学习训练过程510和在线预测过程520的流程图。在离线学习训练过程510中,代码库可存储多个代码片段,本申请实施例可获取代码库中代码片段的关键词(key word),并对代码片段中的非关键词进行替换,以实现预处理过程。基于代码片段中的关键词和替换的非关键词,可进行代码结构的最小划分,形成代码结构树。代码库中各代码片段的代码结构树可进行聚合,形成代码结构树库。
在在线预测过程520中,编辑器服务端可获取用户在代码编辑界面输入的代码文档中,解析出代码文档中的关键词。将代码文档中的关键词与代码结构树库相匹配,得出最佳匹配的代码结构树。进而,对最佳匹配的代码结构树中的代码进行排序、转化为预测的代码片段,以推荐给编辑器前端。
图5b示出了代码编辑界面展示预测的代码片段的示例图。如图5b所示,用户在代码编辑界面输入部分代码数据“s”,编辑器服务端除为用户推荐匹配部分代码数据“s”的候选代码数据外(如图5b中的左框所示),还可在用户从候选代码数据中选择“SELECT_CASE”这一目标代码数据时,进一步推荐与“SELECT_CASE”相匹配的代码片段(如图5b中的右框所示)。
在一些实施例中,本申请实施例可从代码文档中提取多个token(标记)特征,例如多个关键词。该多个token特征可以包含当前输入位置的部分代码数据。从而,编辑器服务端可利用算法推荐,预测与该多个token特征相匹配的代码片段,以提升代码片段的预测准确性。不同于图5b基于“SELECT_CASE”对应的一个select语句,来预测代码片段,图5c示出了基于多个token特征预测代码片段的示意图。如图5c所示,代码编辑界面输入“updateu”,则编辑器服务端可根据这2个token特征,一起预测用户希望的代码片段。
在基于算法推荐的预测方式中,本申请实施例也可自动识别用户在代码编辑界面的当前输入位置,并在代码编辑界面填充预测的代码片段。也就是说,本申请实施例并不是使用预测的代码片段整个替换掉用户的输入内容,而是识别出用户已经输入的部分,并定位到输入位置之后进行代码片段的填充。
在进一步的一些实施例中,本申请实施例可设置预测的代码片段、推荐的候选关键字、候选函数的总数量,例如设置该总数量的限值为设定数量。进而,如果编辑器服务端已确定的候选关键字和候选函数的总数已经达到设定数量,则编辑器服务端可删除一些排序靠后的候选关键字和候选函数,使最终候选关键字、候选函数和预测的代码片段的总数量限制在设定数量。该设定数量的具体数值例如500或者其他数值,具体可根据实际情况定义,本申请实施例对此并不设限。
在本申请实施例进一步的一些实施例中,本申请实施例也可支持代码数据的可视化批量补全。当SQL中存在多张表或者一张表中有多个字段时,如果需要逐一的输入字段,无疑将降低代码编辑效率,因此本申请实施例还提供代码数据的批量补全能力。图6a示出了批量补全代码数据的示意图。参照图6a所示,代码编辑界面可展示批量选择候选代码数据的选择框,用户可以在选择框中进行候选代码数据的多选,从而将选择的代码数据补全到当前输入位置(例如光标位置)。通过代码数据的批量补全能力,用户可以不必再逐一的输入字段,也不需要去记忆一张表中具有哪些字段,可以大大提升用户的代码编辑效率。
在一些实施例中,本申请实施例可采用树的形式来对应能够批量选择的代码数据,例如,树的第一级展示可以选择的候选表,树的第二级展示每个候选表下可以选择的候选字段,树上的每一个节点都支持单选、全选和反选。
在一些实施例中,图6b示出了可视化批量补全代码数据的实现流程图。该流程可由编辑器前端和编辑器服务端配合执行,例如当光标悬停(Hover)在代码编辑界面,且一段时间未执行编辑操作时,编辑器前端可触发执行该流程。参照图6b,该流程可以包括如下步骤。
在步骤S611中,编辑器前端的光标悬停在代码编辑界面。
在步骤S612中,编辑器前端向编辑器服务端发送WebSocket请求,并告诉编辑器服务端当前光标在代码编辑界面上的位置。
在步骤S613中,编辑器服务端根据代码编辑界面当前的代码文档转化的语法树,进行语法解析。
在步骤S614中,编辑器服务端判断是否从代码文档中判断到select语句,若否,执行步骤S615,若是,执行步骤S616。
在步骤S615中,编辑器服务端向编辑器前端返回空值。
此时,编辑器前端的页面不进行任何操作。
在步骤S616中,编辑器服务端判断光标位置是否位于select之后的下一位置附近,若否,执行步骤S615,若是,执行步骤S617。
在步骤S617中,编辑器服务端确定批量补全的代码数据(例如候选表、候选字段等)并返回给编辑器前端。
也就是说,如果编辑器服务端从代码文档中判断到select语句,且光标位置位于select之后的下一位置附近(例如编辑器服务端判断到“select * from table”的语句,且光标位置在“*”位置附近),则编辑器服务端确定批量补全的代码数据并返回给编辑器前端。如果编辑器服务端未从代码文档中判断到select语句,或者光标位置未位于select之后的下一位置附近,则编辑器服务端向编辑器前端返回空值。
在步骤S618中,编辑器前端在代码编辑界面渲染用于用户批量选择代码数据的补全气泡框。
补全气泡框可以是以弹窗展示信息的弹层的一种形式。
在步骤S619中,当用户从补全气泡框中选择补全的代码数据后,编辑器前端将用户选择的代码数据回填到代码编辑界面的光标位置。
在进一步的一些实施例中,在基于Monaco进行开发的基础上,由于Monaco本身并未提供自定义弹层的能力。因此为了将批量补全的代码数据以弹层形式展现,本申请实施例提供了编辑器前端的一套渲染方案。该渲染方案的实现可以是:编辑器前端获取Monaco本身提示信息对应的弹层的类选择器(Selector Id),透过该类选择器,抓取相应的dom元素;将该dom元素的内容清空,填入需要渲染的弹层内容(例如以选项方式展示的用于批量补全的代码数据)。另外,编辑器前端在渲染弹层时,自定义了编辑器本身的focus(焦点)与侦测机制,避免因移出字段或失焦导致弹层消失;同时将已绘的dom元素保存下来,弹层下次再渲染时,编辑器前端可判断是否需要渲染已经保存的dom元素,若是,就用已保存的dom进行重绘。
在本申请实施例进一步的一些实施例中,本申请实施例也可支持光标悬停位置相应的信息提示,简称悬停提示。在一些实施例中,编辑器服务端可识别光标悬停位置的代码数据的唯一标识,根据该唯一标识将代码数据包含的信息反馈给编辑器前端并展示。例如,当光标位置悬停(Hover)到SQL中的表时,编辑器服务端可根据上下文解析出该表的唯一key,获取该表包含的字段信息并返回给编辑器前端进行展示,例如获取该表包含的字段名、字段类型、字段描述等字段信息并返回给编辑器前端进行展示。图6c示出了悬停提示的示意图。如图6c所示,编辑器前端可展示光标位置悬停到的表包含的字段信息。
在一些实施例中,悬停提示也可以视为是与元数据补全类似的自定义规则的数据补全。悬停提示的实现思路可以是:预先在配置中心定义编辑器注册语言的悬停(Hover)规则名称,并定义与悬停规则名称对应的数据获取接口。例如,定义悬停规则的表名,和与悬停规则的表名对应的数据获取接口。图6d示出了悬停提示的实现逻辑流程。参照图6d,该流程可以由编辑器服务端执行,该流程可以包括:
在步骤S621中,将代码编辑界面输入的代码文档转化为语法树。
在步骤S622中,解析语法树,确定光标悬停位置的字符节点(word node)。
在步骤S623中,获取与该字符节点所符合的规则名称。
例如,在光标悬停位置的字符节点对应表时,可获取该字符节点的表名。
在步骤S624中,判断该规则名称是否与悬停规则名称相匹配。
例如,判断该字符节点的表名是否与悬停规则的表名相匹配。
在步骤S625中,若判断结果为是,则通过悬停规则名称对应的数据获取接口,获取到悬停提示信息。
例如,通过与悬停规则的表名对应的数据获取接口,获取该表名的表包含的字段信息。
如果判断结果为规则名称与悬停规则名称不相匹配,则此时无法获取到悬停提示信息,可结束流程。
在本申请进一步的一些实施例中,本申请实施例也可支持元数据智能提取,由于元数据的核心是表,因此在表相关信息的提示层面,本申请实施例可进一步提供动态提取光标所在位置的表的能力、提取整个代码文档的表的能力、提取表血缘关系的能力,下面将逐一进行说明。
在动态提取光标所在位置的表的层面,当光标放置放在一段SQL语句中时,编辑器服务端可解析该SQL语句,以获取该SQL语句中包含的所有元数据的表信息,该表信息可反馈给编辑器前端,由编辑器前端展示到代码编辑界面。例如,该表信息可展示到代码编辑界面右侧的辅助面板当中。图7a示出了提取光标所在位置的表的示意图。如图7a所示,当光标放置在代码编辑界面左侧的一段SQL语句时,代码编辑界面右侧的辅助面板可展示该SQL语句中包含的所有元数据的表信息。
在一些实施例中,编辑器前端可实时同步代码编辑界面中的代码给编辑器服务端。当代码编辑界面的光标位置变动时,编辑器前端会向编辑器服务端发起请求。编辑器服务端解析光标位置,若确定光标位置放置在SQL语句,则确定光标位置对应的SQL语句包含的表,并过滤掉不存在的表,然后返回给编辑器前端,使得编辑器前端可在代码编辑界面右侧的辅助面板,展示光标位置对应的SQL语句包含的表。
在提取整个代码文档的表的能力层面,当光标放置在代码文档的空白行或者注释行的时候,编辑器服务可获取整个代码文档包含的所有元数据的表信息,该表信息可反馈给编辑器前端,由编辑器前端展示到代码编辑界面。例如,该表信息可展示到代码编辑界面右侧的辅助面板当中。图7b示出了提取整个代码文档的表的示意图。如图7b所示,当光标放置在代码编辑界面左侧的空白行,代码编辑界面右侧的辅助面板可展示代码文档包含的所有元数据的表信息。
在一些实施例中,编辑器前端可实时同步代码编辑界面中的代码给编辑器服务端。当代码编辑界面的光标位置变动时,编辑器前端会向编辑器服务端发起请求。编辑器服务端解析光标位置,若确定光标位置放置在代码文档的空白行或者注释行的时候,则编辑器服务端可解析出整个代码文档文件包含的所有元数据的表信息,然后返回给编辑器前端,使得编辑器前端可在代码编辑界面右侧的辅助面板展示。
在提取表血缘关系的层面,为了便于用户查看和使用表相关的字段信息和血缘关系,当光标悬停到表上时,会出现查看表血缘关系的按钮,点击该按钮,则可查看到与该表相关的具有血缘关系的表。图7c示出了表的血缘关系图,可进行参照。相应的,编辑器服务端可获取到编辑器前端发送的获取表血缘关系的请求(该请求例如由用户点击查看表血缘关系的按钮触发),从而编辑器服务端可确定与光标悬停的表具有关联关系的表,作为与光标悬停的表具有血缘关系的表,进而编辑器服务端可将具有血缘关系的表发送给编辑器前端进行展示。
在本申请进一步的一些实施例中,本申请实施例也支持提取其它元数据的相关信息。例如,为了便于用户查看表相关的其它信息,本申请实施例可将表和字段以文件树的形式展示,点击某个表会展开该表包含的字段信息。图7d示出了文件树的示意图,可进行参照。需要说明的是,其它元数据的相关信息的提取,可在需要提取的时候,调用相应的底层接口获取。
在本申请进一步的一些实施例中,本申请实施例还可支持元数据跳转的能力。例如,当用户希望跳到元数据平台查看表的更多信息时,本申请实施例可提供一种便捷的方式,让用户可以快速执行该操作。在一些实施例中,用户可以将光标移动到编辑器模板的表上,并执行设定的快捷操作(例如按住Command键、Ctrl键等预设的快捷键,并在编辑器模板的表的字段上点击鼠标左键),则编辑器前端可向编辑器服务端发送获取元数据平台的表详情页面的请求。从而编辑器服务端可响应该请求,将元数据平台的表详情页面反馈给编辑器前端进行跳转展示。编辑器前端可跳转到元数据平台的表详情页面进行展示,以使得用户查看元数据平台中表的更多信息。图7e示出了元数据平台的表详情页面的跳转示意图,可进行参照。在一个例子中,如图7e所示,当光标移动到“test3in1_bz.mysql_yufa_copy23”这个表上并按住Command键,这时表下会出现下划线;紧接着点击滑鼠左键,这时页面就会跳转到下方页面(即表详情页面)中,以使得用户能够查看元数据平台的表的更多信息。
在实现表详情页面的跳转的一些实施例中,编辑器前端和编辑器服务端可使用LSP(语言服务器协议)本身的跳转协议,并在此基础上,劫持monaco创建时的服务(service)配置,对其进行改造。例如,用户触发了跳转到另一个编辑器的case(情况),且当前语言是需要自定义跳转链接的语言;则当用户执行设定的快捷操作时(例如用户点击Command键,并且鼠标左键触发definition协议请求),则编辑器服务端可解析出当前光标位置的表,并获取对应的元数据地址,通过definition协议返回给编辑器前端,编辑器前端将对应地址赋值给monaco的model.uri,并触发openEditor事件,该事件通过service中的resource获取到该地址,并通过window.open打开新页面实现表详情页面的跳转。如果当前语言不是需要自定义跳转链接的语言,则编辑器服务端通过definition协议,返回需要跳转到文件的uri给编辑器前端,然后编辑器前端会走原本的跳转到另一个编辑器的逻辑,直接打开相应的文件,实现表详情页面的跳转。
在本申请进一步的一些实施例中,本申请实施例还可支持查看全部元数据列表的能力。当用户在编辑代码的过程中,如果不知道有哪些表可以使用,则基于查看全部元数据列表的能力,可使得用户能够查看到可以使用的表。在一些实施例中,用户选择库之后,编辑器服务端可会获取选择库下的表,并反馈给编辑器前端进行展示。图7f示出了库下的表的示意图。在进一步的一些实施例中,对于代码编辑界面展示的某一表,如果用户点击了该表,则编辑器服务端可将该表的字段信息反馈给编辑器前端进行展示。当用户在表上点击右键等预设操作时,编辑器服务可将该表的数据反馈给编辑器前端,以使得用户可以在代码编辑界面预览该表数据。
在进一步的一些实施例中,在编辑代码的过程中,不同用户具有不同的用户属性,例如不同用户具有不同的历史输入代码数据、编辑习惯、业务需求等用户属性,因此针对不同用户,本申请实施例可推荐适应于用户属性的数据补全内容,实现数据补全推荐的千人千面。例如,不同用户有不同的业务需求,因此针对不同用户,SQL代码文档中需要用到的候选代码数据可能也存在较大差异(尤其是在跟业务紧密相关的候选元数据的推荐层面),因此为了使数据补全更加个性化,本申请实施例还支持了千人千面的数据补全推荐。在一些实施例中,编辑器服务端可记忆用户历史输入的代码数据,优先为用户推荐与用户历史输入的代码数据相对应的候选代码数据。相应的,编辑器服务端可将候选代码数据中与用户属性适应的代码数据设置为靠前排序。在一些实施例中,在推荐候选表、候选函数、候选关键字等情况下,本申请实施例也可优先推荐用户常用的表、常用的函数、常用的关键字(例如将用户常用的表、常用的函数、常用的关键字,在候选表、候选函数、候选关键字中设置为靠前排序)。图8a示出了基于历史输入的候选代码数据的推荐示意图。如图8a所示,用户先后两次分别编辑了“autotest.qy_0430”,当第三次用户再次输入“autotest. ”时,编辑器服务端可自动将“qy_0430”前置到候选代码数据中的第一位并反馈给编辑器前端,以供用户选择。
在一些实施例中,本申请实施例可通过编辑器服务端设置的推荐模型,来实现推荐适应于用户属性的数据补全内容。图8b示出了推荐模型的训练流程图。如图8b所示,该流程可以包括如下步骤。
在步骤S811中,选择指定的模型结构。
例如,选择合适轻量的语言模型,比如LSTM(长短期记忆网络)模型等。选择的模型结构可以支持预训练,也可不进行预训练。
在步骤S812中,获取用户历史的代码数据,对用户历史的代码数据进行预处理,存储得到训练数据。
在步骤S813中,根据训练数据,训练模型结构。
随着时间推移,用户历史输入的代码数据可能在不断的产生。因此步骤S812和步骤S813可以定时触发执行。例如,用户输入的代码数据随着时间推移,成为用户历史输入的代码数据后,可基于该代码数据,对之前训练的模型再进一步进行训练。
在步骤S814中,产生训练的推荐模型。
图8c示出了推荐模型的预测流程图。如图8c所示,该流程可以包括如下步骤。
在步骤S821中,编辑器服务器根据代码编辑界面当前的代码文档转化的语法树,进行语法解析,获取到代码上下文信息。
在步骤S822中,将代码上下文信息输入推荐模型,产生预测的候选代码数据的序列,该代码数据序列可以包括排序的多个候选代码数据。
在步骤S823中,将候选代码数据的序列反馈给编辑器前端,以便编辑器前端进行展示。
在本申请进一步的一些实施例中,本申请实施例可以支持用户在代码编辑过程中进行个性化的功能配置。例如,用户可以设置代码风格、设置进行数据补全数据类型(例如,用户可从关键字、函数、元数据等数据类型中选择进行数据补全的数据类型),设置代码提示的类型(比如是否开启连续智能补全提示)、也可以设置自动填入补全的候选代码数据的操作(比如设置回车或是Tab按键等,来操作是否自动填入补全的候选代码数据)。图8d示出了可由用户进行个性化配置的页面的示意图,可进行参照。
在一些实施例中,编辑器前端可展示个性化配置界面,确定用户在所述个性化配置页面选择的配置选项,所述配置选项至少包括请求数据补全的数据类型选项,和/或,优先进行数据补全的数据类型选项;其中,优先进行数据补全的数据类型选项,与编辑器服务端优先检测的数据类型相对应。
在一些实施例中,除了连续智能补全提示比较特殊外,其它功能在底层基础搭建好之后,只需按底层基础中的方案操作即可。如果用户开启连续智能补全提示,编辑器服务端在返回的可触发补全的候选代码数据中,要加上设定字符(例如空格);除了对返回的用于补全的包含候选代码数据的列表添加设定字符外,还需要添加自动触发下次数据补全请求的命令(command),这样用户在选择某个候选代码数据作为输入的目标代码数据后,编辑器前端会自动触发下一次的数据补全请求。
在实现用户个性化配置的一些实施例中,针对不涉及编辑器服务端获取和提供数据的参数变更,而只涉及编辑器前端编辑器本身的配置的情况下,用户可在修改配置时,只需更新编辑器前端monaco的配置。在另一些实施例中,针对涉及编辑器服务端获取和提供数据参数变更的配置,在用户修改配置时,需要在用户无感知的情况,保留编辑器的当前状态,重新进行初始化LSP服务。图8e示出个性化配置的实现流程图。如图8e所示,该流程可以包括:
在步骤S831中,编辑器前端获取用户个性化的配置内容。
在步骤S832中,编辑器前端判断所述配置内容是否涉及编辑器服务端的配置修改,若是,执行步骤S833,若否,执行步骤S834。
在步骤S833中,编辑器前端保留编辑器的当前状态,根据所述配置内容请求编辑器服务器重新初始化LSP服务。
在步骤S834中,编辑器前端根据所述配置内容,更新编辑器前端的monaco的配置。
进一步的,在完成配置修改后,编辑器前端基于配置内容,可呈现对应的展示效果。
在本申请实施例进一步的一些实施例中,由于在线代码编辑场景下,对性能的要求较高,如果编辑器服务端一次向编辑器前端返回数量较多的候选代码数据,则可能会导致网络接口的性能变慢,从而导致数据补全提示的不及时,这会让用户感到数据补全提示的卡顿。基于此,本申请实施例可在编辑器前端缓存历史推荐的历史候选代码数据(例如,缓存上次推荐的包含历史候选代码数据的推荐列表),在编辑器服务端对当前返回的候选代码数据进行分页处理,使得每页的候选代码数据的数量不大于设定数量,以将编辑器服务端每次返回的候选代码数据的数量控制在设定数量的上限。
在一些实施例中,编辑器前端可通过编辑器服务端每次在返回候选代码数据时携带的isIncomplete(不完整)字段,来了解编辑器服务端是否已将所有的候选代码数据均全部返回。例如,该isIncomplete字段为true(真),则表示编辑器服务端匹配到候选代码数据大于设定数量(例如大于500条),还有候选代码数据没有返回;该isIncomplete字段为false(假),则表示编辑器服务端匹配到的候选代码数据均已全部返回。
进而,在一些实施例中,编辑器前端针对当前输入位置的部分代码数据,可先判断缓存的历史候选代码数据中,是否有与该部分代码数相匹配的候选代码数据,若有,且编辑器服务端反馈的isIncomplete字段为false,则编辑器前端可从缓存的历史候选代码数据中确定出用于数据补全的候选代码数据。若编辑器前端判断缓存的历史候选代码数据中,不具有与该部分代码数相匹配的候选代码数据,或编辑器服务端反馈的isIncomplete字段为true,则编辑器前端可重新向编辑器服务端发送数据补全请求,以请求编辑器服务端发送未返回的候选代码数据。
在一些实施例中,如果编辑器前端没有配置连续智能补全提示,则编辑器服务端在获取候选代码数据时,可根据用户输入的keyword(包含当前输入位置的部分代码数据)作为筛选条件进行匹配。如果编辑器服务端匹配到的候选代码数据的总数据量超过设定数量,则可对匹配的候选代码数据进行分页,当前仅向编辑器前端反馈一页的候选代码数据,余下的候选代码数据可在下次编辑器前端再发送数据补全请求时,再根据最新的keyword进行候选代码数据的匹配。
在一些实施例中,如果编辑器前端配置了连续智能补全提示,编辑器服务端确定当前需要对元数据进行数据补全,则编辑器服务端可先从元数据中心获取匹配的候选元数据;如果获取的候选元数据的数量结果不足设定数量,编辑器服务端可补充代码文档的关键字;基于候选的元数据,以及补充的关键字,编辑器服务器可进行算法排序,从而取排序靠前的设定数量的结果反馈给编辑器前端;另外算法只对关键字排序,如果是非关键字,比如库、表、字段、函数之类的,会保留补充时的顺序。
在一些实施例中,编辑器前端还可能会在以下情况下,重新触发数据补全请求:
编辑器前端在语音服务的初始化时,通过LSP服务获取可触发数据补全的预设代码数据;然后在用户编辑代码的过程中,判断当前输入的代码数据是否与该预设代码数据相应,若是,则触发数据补全请求;
编辑器前端通过用户自定义配置的规则,判断是否自动触发下一次数据补全请求;例如用户输入空格,则触发连续智能补全提示,继续进行后续的数据补全请求;
在一些实施例中,编辑器前端删除字符不会触发数据补全请求。当然,这仅是一种可选实现,本申请实施例也可支持删除字符时,触发数据补全请求。
在本申请实施例进一步的一些实施例中,为保障编辑器的服务稳定性,本申请实施例提供一些异常兼容的手段,包括服务异常时的服务降级、通信异常时的通信断线重连等。下面将分别进行说明。
服务降级是指由编辑器服务端提供服务,降级为由编辑器前端本地提供服务,例如降级为由编辑器前端的本地编辑器实现数据补全功能等。本申请实施例可能在如下情况下进行服务降级。
1) 后端LSP服务不可用,则服务降级为本地编辑器。
2)如果后端LSP服务可用,继续走LSP服务端接口,判断 LSP服务是否支持编辑器的语言,若否,降级为本地编辑器,若是,则不降级。
3) 离线情况下,编辑器降级为本地编辑器。
4) 在线的异常情况,如果后端LSP服务可用,也支持编辑器的语言,但突然断网,则当前已经加载过的编辑器降级为本地编辑器,并保有语法高亮能力;后端LSP服务可用,也支持编辑器的语言,但由于没有连接特定的vpn而不能访问内网,则当前已经加载过的编辑器降级为本地编辑器,并保有语法高亮能力;以上在线的异常情况,会在编辑器前端的后台默认进行断线重连策略,直到网络恢复后,使用服务端的编辑器。
5) 本申请实施例也支持用户自主选择是否使用LSP能力,若不使用LSP能力,则直接降级为本地编辑器。
网络异常或服务端异常等情况,会引起编辑器前端和编辑器服务端通信连接的断开(例如websocket连接的断开),此时编辑器前端和编辑器服务端不能再通过原有的通道进行通信,必须建立新的通道,来恢复通信并恢复原本编辑器、语言配置和LSP服务的状态。例如,在websocket通信连接异常时,需要进行websocket重连。在此情况下,本申请实施例可提供如下断线重连策略。
1) 在websocket 连接关闭(close)时进行重连, 并保证重连超时(timeout)事件最多执行预设次数(例如30次),时间间隔为预设时间间隔(例如1000ms)。
2) 用户存在编辑代码的行为时,若websocket连接是断开状态,也会执行websocket重连程序。
3) 编辑器前端和编辑器服务端每次只存在一个websocket连接,如果处于websocket的重连过程,则不执行下一次websocket重连,例如websocket重连启动之前,若已存在上次的websocket连接,则把上次存在的websocket连接断开,再启动websocket重连。
4) 向LSP服务发请求之前,若websocket重连是断开的,则执行websocket重连。重连机制为无重连上限,直到websocket连上为止。但是重连的timeout间隔以倍数递增,例如为预设时间间隔的重连次数幂,例如1000ms*(1.5的重连次数幂),上限为30s。
5) 对window增加online(在线)事件监听,监听到电脑网络连接上,并且当前websocket连接是断开状态,则执行websocket重连。
6) 监听断网(offline)事件、websocket连接 error(错误)事件,上述事件触发时,把websocket连接状态置为false,执行websocket重连。
7) 添加电脑在线和浏览器激活的校验判断,若同时满足,启动websocket重连。
8) websocket重连设置延时判断,若连接websocket 在一定时间内(例如5s)还没open、close、error等信息,就终止此次websocket重连,以便渲染组件。
9) 在on error事件中打开websocket重连标志,保证可以进行websocket重连;另外,若连接websocket 在一定时间内(例如5s)还没open、close、error等信息,就手动关闭websocket连接,以便及时执行websocket重连。
在本申请进一步的一些实施例中,本申请实施例可实现编辑器支持多语言。为了快速支持多语言,本申请实施例可根据编辑器与语言服务器的交互,制定了一套公共的流程,每个语言实现 LSP 协议后,编辑器只需调用不同语言的语言服务(Language Server),即可支持不同语言特性。但由于每门语言的语法规则和编辑器相关配置都是不同的,因此本申请实施例进一步开发了语法配置管理平台。把每门语言的语法规则配置在该平台,在需要某门语言的语法配置时,调用相应的接口获取即可。语法配置管理平台主要有以下三个用途:用于新增语言支持;修改语言配置信息,包括支持的编辑器能力、能触发数据补全的部分代码数据(例如字符)等;将语言配置发布到LSP服务等。
另外,为了快速响应用户的编辑行为,本申请实施例实现了多语言共用一个websocket通道的能力,并为每门语言分配一个LSP Client(客户端)来进行语言服务的管理,同时一门语言可以对应多个编辑器实例,以此保证同时满足不同语言的不同交互需求。由于不同语言需要的元数据不同,因此本申请实施例定义了一套LSP服务端需要的数据API协议格式,调用方只需实现对应的API,LSP就可以调用到元数据进行提示。但LSP服务本身不会存储任何权限数据,LSP服务能调用业务方服务的唯一凭证是业务方在浏览器中的cookie,因此在WebSocket连接时,本申请实施例可将cookie原封不动的透传给业务系统,让业务系统根据cookie信息来做鉴权。
在本申请进一步的一些实施例中,编辑器可支持多种数据源,这可能涉及到语言类型的变化、当前全局元数据的变化;针对这种情况,本申请实施例自定义扩展了LSP协议,支持了切换数据源的请求,同时封装了切换LSP Client的方法。当编辑器服务端接收到编辑器前端发送的切换数据源的请求时,如果数据源只是元数据不同,则编辑器服务端可获取切换的数据源的最新配置信息,保证编辑器服务端调用的服务能够对应切换的数据源。如果切换的数据源是语言类型不同,则为当前编辑器切换语言,并切换到新语言的LSPClient(如果新语言的LSP Client还不存在,则重新初始化LSP Client,并初始化对应的语言服务),从而编辑器服务端可获取数据源的最新配置信息,保证编辑器服务端在编辑器切换语言服务的状态下,编辑器服务端调用的服务能够对应切换的数据源。
在本申请实施例的一个应用示例中,编辑器可用于数据工程平台(例如DataWorks)。数据工程平台是专注于数据开发和数据治理,为企业提供数据管理能力的下一代数据产品。在数据工程平台中,编辑器在整个数据开发中占据着不可或缺的地位,从开发、调试、运行、发布,到运维,都能见到编辑器的身影,尤其是基于编辑器的SQL编辑工作。
使用本申请实施例提供的代码编辑方案,可使得用于数据工程平台的编辑器,可由编辑器服务端基于数据类型实现适应的数据补全功能,实现支持多数据类型的数据补全,例如实现关键字、函数、元数据(例如表、字段、库)等不同数据类型的数据补全,提升用户编辑代码的效率。进一步,编辑器能够支持多种语言的编辑能力,例如支持SQL类、开发语言类、普通脚本类、自定义语言类等各类语言的编辑需求。本申请实施例可在每一种语言下,均实现不同数据类型的数据补全推荐和提示,满足多种类语言、多数据类型的数据补全需求。此外,数据工程平台需要面对的表非常众多,本申请实施例提供元数据的智能提取方案,涉及动态提取光标所在位置的表、提取整个代码文档的表、提取表血缘关系、以及提取其它元数据的相关信息,能够使得用户了解到表的更多信息,使得用户在了解元数据的基础上,更为方便的使用数据补全功能。
本申请实施例能够用于数据工程平台的编辑器的其他功能可参照前文相应部分的描述,此处不再赘述。
上文描述了本申请实施例提供的多个实施例方案,各实施例方案介绍的各可选方式可在不冲突的情况下相互结合、交叉引用,从而延伸出多种可能的实施例方案,这些均可认为是本申请实施例披露、公开的实施例方案。
下面对应用于编辑器服务端的代码编辑装置进行介绍。下文描述的装置内容可以认为是编辑器服务端为实现本申请实施例提供的代码编辑方法,所需设置的功能模块。下文描述的装置内容可与上文描述内容相互参照。需要说明的是,编辑器服务端实现的代码编辑方法,与编辑器前端实现的代码编辑方法是相对应的,两者可相互参照。
图9a示出了本申请实施例提供的代码编辑装置的框图。如图9a所示,该装置可以包括:
数据补全请求获取模块910,用于获取编辑器前端发送的数据补全请求,所述数据补全请求包括代码编辑界面实时的代码变更内容;
代码文档确定模块911,用于根据所述代码变更内容,确定所述代码编辑界面实时输入的代码文档;
语法树转化模块912,用于将所述代码文档转化为语法树;
解析模块913,用于根据所述语法树,解析所述代码文档中当前输入位置的部分代码数据,以及解析所述部分代码数据的数据类型;所述数据类型包括如下任一项:关键字、函数和元数据;所述元数据包括表、字段、库;
候选代码数据确定模块914,用于根据所述数据类型,确定匹配所述部分代码数据的候选代码数据;
数据发送模块915,用于将所述候选代码数据发送给编辑器前端进行展示。
在一些实施例中,解析模块913,用于根据所述语法树,解析所述部分代码数据的数据类型包括:
调用第一数据类型相应的检测逻辑,根据所述第一数据类型相应的检测逻辑以及所述语法树,检测所述部分代码数据的数据类型是否为第一数据类型;
其中,所述第一数据类型相应的检测逻辑的调用顺序预先设置,且在检测所述部分代码数据的数据类型不为第一数据类型时,调用第二数据类型相应的检测逻辑,以根据所述第二数据类型相应的检测逻辑以及所述语法树,检测所述部分代码数据的数据类型是否为第二数据类型;所述第一数据类型不同于第二数据类型。
在一些实施例中,所述第一数据类型为关键字;解析模块913,用于根据所述第一数据类型相应的检测逻辑以及所述语法树,检测所述部分代码数据的数据类型是否为第一数据类型包括:
遍历语法树进行语法诊断;
获取语法诊断结果,所述语法诊断结果包括代码文档中错误对象的错误提示,所述错误对象包括所述代码文档中当前输入位置的部分代码数据。
若所述部分代码数据的错误提示为缺少关键字,则确定所述部分代码数据的数据类型为关键字。
相应的,候选代码数据确定模块914,用于根据所述数据类型,确定匹配所述部分代码数据的候选代码数据包括:
根据所述部分代码数据的错误提示,确定与所述部分代码数据相匹配的候选关键字;所述部分代码数据的错误提示还提示有所述部分代码数据可能匹配的正确关键字。
在进一步的一些实施例中,本申请实施例提供的装置还可对关键字进行排序,相应的,该装置还可通过设置功能模块实现如下功能:
根据预训练的智能排序模型,对所述候选关键字进行排序;
所述将所述候选代码数据发送给编辑器前端包括:
将包含所述排序的候选关键字发送给编辑器前端。
在一些实施例中,所述第二数据类型为函数,例如,解析模块913可在检测所述部分代码数据的数据类型不为第一数据类型时,检测所述部分代码数据的数据类型是否为函数。解析模块913,用于根据所述第二数据类型相应的检测逻辑以及所述语法树,检测所述部分代码数据的数据类型是否为第二数据类型包括:
根据语法树,判断当前输入位置之前的节点,是否为预设的推荐函数的节点,若是,确定当前输入位置的部分代码数据的数据类型为函数。
相应的,候选代码数据确定模块914,用于根据所述数据类型,确定匹配所述部分代码数据的候选代码数据包括:
确定匹配所述部分代码数据的候选函数。
在一些实施例中,所述第二数据类型为元数据,例如,解析模块913可在检测所述部分代码数据的数据类型不为第一数据类型时,检测所述部分代码数据的数据类型是否为元数据。解析模块913,用于根据所述第二数据类型相应的检测逻辑以及所述语法树,检测所述部分代码数据的数据类型是否为第二数据类型包括:
根据语法树,判断当前输入位置的部分代码数据之前的代码字符是否为预设的调用表的字符,若是,确定所述部分代码数据的数据类型为元数据中的表,其中,所述候选代码数据包括候选表;
或者,根据语法树,判断当前输入位置之前的节点,是否为预设的推荐字段的节点,若是,确定所述部分代码数据的数据类型为元数据中的字段,其中,所述候选代码数据包括候选字段,所述候选字段为属于当前表中的字段。
在一些实施例中,候选代码数据确定模块914,用于根据所述数据类型,确定匹配所述部分代码数据的候选代码数据包括:
在所述部分代码数据的数据类型为元数据时,判断当前输入位置的部分代码数据是否符合元数据名称;若是,根据自定义的所述元数据名称对应的数据获取接口,获取与所述部分代码数据相匹配的候选元数据。
在进一步的一些实施例中,该装置还可在推荐数据补全的候选表时,推荐候选库;相应的,该装置还可通过设置功能模块实现如下功能:
在确定候选表时,确定匹配所述部分代码数据的候选库;其中,候选库与候选表同步推荐给编辑器前端,以进行库和表的数据补全;所述候选表属于编辑器前端使用的当前库,所述候选库中具有不同于所述当前库的库。
在进一步的一些实施例中,本申请实施例提供的装置还可实现代码片段的预测,相应的,该装置还可通过设置功能模块实现如下功能:
从代码文档中提取多个token特征,所述多个token特征包括所述部分代码数据;
利用算法推荐,预测与所述多个token特征相匹配的代码片段;其中,所述算法推荐基于代码库中的多个代码片段对应的代码结构树库实现,所述代码结构树库包括多个代码结构树,所述代码结构树基于对代码片段进行代码结构的最小划分得到;
将预测的代码片段发送给编辑器前端。
在进一步的一些实施例中,本申请实施例提供的装置还可通过设置一个或多个功能模块,分别实现如下至少一项功能:
解析语法树,确定光标悬停位置的字符节点,获取与该字符节点所符合的规则名称,若该规则名称与悬停规则名称相匹配,通过所述悬停规则名称对应的数据获取接口,获取到悬停提示信息并发送给编辑器前端进行展示;
和/或,解析光标放置的SQL语句,以获取该SQL语句中包含的所有元数据的表信息,将获取的表信息发送给编辑器前端进行展示;
和/或,若光标放置在代码文档的空白行或者注释行,获取代码文档包含的所有元数据的表信息,将获取的表信息发送给编辑器前端进行展示;
和/或,获取编辑器前端发送的获取表血缘关系的请求,确定与光标悬停的表具有关联关系的表,作为具有血缘关系的表,将具有血缘关系的表发送给编辑器前端进行展示;
和/或,获取编辑器前端发送的获取元数据平台的表详情页面的请求,将元数据平台的表详情页面发送给编辑器前端进行展示;
和/或,将编辑器前端选择的库下的表反馈给编辑器前端进行展示;
和/或,将候选代码数据中与用户属性匹配的代码数据设置为靠前排序,所述用户属性包括用户的历史输入代码数据、编辑习惯、业务需求;
和/或,若用户个性化配置的配置内容涉及编辑器服务端的配置修改,基于所述配置内容重新初始化LSP语言服务器协议的服务;其中,若所述配置内容不涉及编辑器服务端的配置修改,则直接在编辑器前端进行配置修改;
和/或,若候选代码数据的数量超过设定数量,对候选代码数据进行分页处理,使得每页的候选代码数据的数量不大于设定数量,一次向编辑器前端返回一页的候选代码数据以及isIncomplete不完整字段,所述isIncomplete字段的值表示编辑器服务端是否已将所有的候选代码数据均全部返回;其中,若编辑器前端缓存的历史候选代码数据中未存在与所述部分代码数相匹配的代码数据,且所述isIncomplete字段表示编辑器服务端未将所有的候选代码数据均全部返回,则获取编辑器前端重新发送的数据补全请求;
和/或,在websocket通信连接异常时,进行websocket重连,其中,编辑器服务端与编辑器前端基于websocket进行通信连接;
和/或,在编辑器服务端的服务异常时,将服务降级为编辑器前端的本地编辑器实现;
和/或,为各语言实现 LSP协议,以在编辑器使用一个语言编辑代码时,调用该语言相应的语言服务,其中,一个语言分配一个LSP客户端进行语言服务的管理,一个语言对应多个编辑器实例;
和/或,接收编辑器前端发送切换数据源的请求,如果数据源中的元数据不同,则可获取切换的数据源的最新配置信息;如果切换的数据源的语言不同,则为当前编辑器切换语言,并切换到新语言的LSP 客户端,以及获取数据源的最新配置信息。
在本申请的一些实施例中,编辑器可应用于数据工程平台。
本申请实施例还提供一种编辑器服务端,该编辑器服务端可通过装载上述应用于编辑器服务端的装置,以实现代码编辑方法。图9b示出了编辑器服务端的可选框图。如图9b所示,该编辑器服务端可以包括:至少一个处理器1,至少一个通信接口2,至少一个存储器3和至少一个通信总线4。
在本申请实施例中,处理器1、通信接口2、存储器3、通信总线4的数量为至少一个,且处理器1、通信接口2、存储器3通过通信总线4完成相互间的通信。
可选的,通信接口2可以为用于进行网络通信的通信模块的接口。
可选的,处理器1可能是CPU(中央处理器),GPU(Graphics Processing Unit,图形处理器),NPU(嵌入式神经网络处理器),FPGA(Field Programmable Gate Array,现场可编程逻辑门阵列),TPU(张量处理单元),AI芯片,特定集成电路ASIC(Application SpecificIntegrated Circuit),或者是被配置成实施本申请实施例的一个或多个集成电路等。
存储器3可能包含高速RAM存储器,也可能还包括非易失性存储器(non-volatilememory),例如至少一个磁盘存储器。
其中,存储器3存储一条或多条计算机可执行指令,处理器1调用所述一条或多条计算机可执行指令,以执行编辑器服务端执行的代码编辑方法。
下面对应用于编辑器前端的代码编辑装置进行介绍。下文描述的装置内容可以认为是编辑器前端为实现本申请实施例提供的代码编辑方法,所需设置的功能模块。
图9c示出了本申请实施例提供的代码编辑装置的另一框图。如图9c所示,该装置可以包括:
编辑界面展示模块921,用于展示代码编辑界面;
请求发送模块922,用于向编辑器服务端发送数据补全请求,所述数据补全请求包括代码编辑界面实时的代码变更内容;
候选代码数据获取模块923,用于获取编辑器服务端基于代码编辑界面的当前输入位置的部分代码数据的数据类型,所反馈的候选代码数据,所述候选代码数据与所述部分代码数据相匹配;所述数据类型包括如下任一项:关键字、函数和元数据;所述元数据包括表、字段、库;
候选代码数据展示模块924,用于在所述代码编辑界面展示所述候选代码数据;
选择输入模块925,用于从所述候选代码数据中选择输入的目标代码数据。
在一些实施例中,所述部分代码数据的数据类型可以包括:关键字、函数、元数据中的表、元数据的字段、元数据中的库。
在一些实施例中,编辑器前端对应的编辑器可用于数据工程平台。
应用于编辑器前端的装置的功能,可与用于编辑器服务端的装置的功能相对应,两者可相互参照,此处不再进一步展开。
本申请实施例还提供一种用户设备,该用户设备可运行编辑器前端,并可通过装载上述应用于编辑器前端的装置,以实现代码编辑方法。该用户设备的框图可结合图9b所示,包括至少一个存储器和至少一个处理器,所述存储器存储一条或多条计算机指令,所述处理器调用所述计算机指令以执行编辑器前端执行的代码编辑方法。
本申请实施例还提供一种存储介质,该存储介质可存储一条或多条计算机指令,所述计算机指令被执行时实现如编辑器服务端执行的代码编辑方法,或者,如编辑器前端执行的代码编辑方法。
虽然本申请实施例披露如上,但本申请并非限定于此。任何本领域技术人员,在不脱离本申请的精神和范围内,均可作各种更动与修改,因此本申请的保护范围应当以权利要求所限定的范围为准。
Claims (14)
1.一种代码编辑方法,其中,所述方法应用于编辑器服务端,所述方法包括:
获取编辑器前端发送的数据补全请求,所述数据补全请求包括代码编辑界面实时的代码变更内容;
根据所述代码变更内容,确定所述代码编辑界面实时输入的代码文档;
将所述代码文档转化为语法树;
根据所述语法树,解析所述代码文档中当前输入位置的部分代码数据,以及解析所述部分代码数据的数据类型;所述数据类型包括如下任一项:关键字、函数和元数据;所述元数据包括表、字段、库;
根据所述数据类型,确定匹配所述部分代码数据的候选代码数据;
将所述候选代码数据发送给编辑器前端进行展示。
2.根据权利要求1所述的方法,其中,所述根据所述语法树,解析所述部分代码数据的数据类型包括:
调用第一数据类型相应的检测逻辑,根据所述第一数据类型相应的检测逻辑以及所述语法树,检测所述部分代码数据的数据类型是否为第一数据类型;
其中,所述第一数据类型相应的检测逻辑的调用顺序预先设置,且在检测所述部分代码数据的数据类型不为第一数据类型时,调用第二数据类型相应的检测逻辑,以根据所述第二数据类型相应的检测逻辑以及所述语法树,检测所述部分代码数据的数据类型是否为第二数据类型;所述第一数据类型不同于第二数据类型。
3.根据权利要求2所述的方法,其中,所述第一数据类型为关键字,所述根据所述第一数据类型相应的检测逻辑以及所述语法树,检测所述部分代码数据的数据类型是否为第一数据类型包括:
遍历语法树进行语法诊断;
获取语法诊断结果,所述语法诊断结果包括代码文档中错误对象的错误提示,所述错误对象包括所述代码文档中当前输入位置的部分代码数据;
若所述部分代码数据的错误提示为缺少关键字,则确定所述部分代码数据的数据类型为关键字;
所述根据所述数据类型,确定匹配所述部分代码数据的候选代码数据包括:
根据所述部分代码数据的错误提示,确定与所述部分代码数据相匹配的候选关键字;所述部分代码数据的错误提示提示有所述部分代码数据可能匹配的正确关键字。
4.根据权利要求2所述的方法,其中,所述第二数据类型为函数,所述根据所述第二数据类型相应的检测逻辑以及所述语法树,检测所述部分代码数据的数据类型是否为第二数据类型包括:
根据语法树,判断当前输入位置之前的节点,是否为预设的推荐函数的节点,若是,确定当前输入位置的部分代码数据的数据类型为函数;
所述根据所述数据类型,确定匹配所述部分代码数据的候选代码数据包括:
确定匹配所述部分代码数据的候选函数。
5.根据权利要求2所述的方法,其中,所述第二数据类型为元数据,所述根据所述第二数据类型相应的检测逻辑以及所述语法树,检测所述部分代码数据的数据类型是否为第二数据类型包括:
根据语法树,判断当前输入位置的部分代码数据之前的代码字符是否为预设的调用表的字符,若是,确定所述部分代码数据的数据类型为元数据中的表,其中,所述候选代码数据包括候选表;
或者,根据语法树,判断当前输入位置之前的节点,是否为预设的推荐字段的节点,若是,确定所述部分代码数据的数据类型为元数据中的字段,其中,所述候选代码数据包括候选字段,所述候选字段为属于当前表中的字段。
6.根据权利要求5所述的方法,其中,所述根据所述数据类型,确定匹配所述部分代码数据的候选代码数据包括:
在所述部分代码数据的数据类型为元数据时,判断当前输入位置的部分代码数据是否符合元数据名称;若是,根据自定义的所述元数据名称对应的数据获取接口,获取与所述部分代码数据相匹配的候选元数据;
所述方法还包括:
在确定候选表时,确定匹配所述部分代码数据的候选库;其中,候选库与候选表同步推荐给编辑器前端,以进行库和表的数据补全;所述候选表属于编辑器前端使用的当前库,所述候选库中具有不同于所述当前库的库。
7.根据权利要求1-6任一项所述方法,其中,所述方法还包括:
从代码文档中提取多个token特征,所述多个token特征包括所述部分代码数据;利用算法推荐,预测与所述多个token特征相匹配的代码片段;其中,所述算法推荐基于代码库中的多个代码片段对应的代码结构树库实现,所述代码结构树库包括多个代码结构树,所述代码结构树基于对代码片段进行代码结构的最小划分得到;将预测的代码片段发送给编辑器前端;
和/或,解析语法树,确定光标悬停位置的字符节点,获取与该字符节点所符合的规则名称,若该规则名称与悬停规则名称相匹配,通过所述悬停规则名称对应的数据获取接口,获取到悬停提示信息并发送给编辑器前端进行展示;
和/或,解析光标放置的SQL语句,以获取该SQL语句中包含的所有元数据的表信息,将获取的表信息发送给编辑器前端进行展示;
和/或,若光标放置在代码文档的空白行或者注释行,获取代码文档包含的所有元数据的表信息,将获取的表信息发送给编辑器前端进行展示;
和/或,获取编辑器前端发送的获取表血缘关系的请求,确定与光标悬停的表具有关联关系的表,作为具有血缘关系的表,将具有血缘关系的表发送给编辑器前端进行展示;
和/或,获取编辑器前端发送的获取元数据平台的表详情页面的请求,将元数据平台的表详情页面发送给编辑器前端进行展示;
和/或,将编辑器前端选择的库下的表反馈给编辑器前端进行展示;
和/或,将候选代码数据中与用户属性匹配的代码数据设置为靠前排序,所述用户属性包括用户的历史输入代码数据、编辑习惯、业务需求;
和/或,若用户个性化配置的配置内容涉及编辑器服务端的配置修改,基于所述配置内容重新初始化LSP服务,其中,若所述配置内容不涉及编辑器服务端的配置修改,则直接在编辑器前端进行配置修改;
和/或,若候选代码数据的数量超过设定数量,对候选代码数据进行分页处理,使得每页的候选代码数据的数量不大于设定数量,一次向编辑器前端返回一页的候选代码数据以及isIncomplete不完整字段,所述isIncomplete字段的值表示编辑器服务端是否已将所有的候选代码数据均全部返回;其中,若编辑器前端缓存的历史候选代码数据中未存在与所述部分代码数相匹配的代码数据,且所述isIncomplete字段表示编辑器服务端未将所有的候选代码数据均全部返回,则获取编辑器前端重新发送的数据补全请求;
和/或,在websocket通信连接异常时,进行websocket重连,其中,编辑器服务端与编辑器前端基于websocket进行通信连接;
和/或,在编辑器服务端的服务异常时,将服务降级为编辑器前端的本地编辑器实现;
和/或,为各语言实现 LSP协议,以在编辑器使用一个语言编辑代码时,调用该语言相应的语言服务,其中,一个语言分配一个LSP客户端进行语言服务的管理,一个语言对应多个编辑器实例;
和/或,接收编辑器前端发送切换数据源的请求,如果数据源中的元数据不同,则获取切换的数据源的最新配置信息;如果切换的数据源的语言不同,则为当前编辑器切换语言,并切换到新语言的LSP 客户端,以及获取切换的数据源的最新配置信息。
8.一种代码编辑方法,其中,所述方法应用于编辑器前端,所述方法包括:
展示代码编辑界面;
向编辑器服务端发送数据补全请求,所述数据补全请求包括代码编辑界面实时的代码变更内容;
获取编辑器服务端基于代码编辑界面的当前输入位置的部分代码数据的数据类型,所反馈的候选代码数据,所述候选代码数据与所述部分代码数据相匹配;所述数据类型包括如下任一项:关键字、函数和元数据;所述元数据包括表、字段、库;
在所述代码编辑界面展示所述候选代码数据;
从所述候选代码数据中选择输入的目标代码数据。
9.根据权利要求8所述方法,其中,还包括:
展示个性化配置界面,确定用户在所述个性化配置页面选择的配置选项,所述配置选项至少包括请求数据补全的数据类型选项,和/或,优先进行数据补全的数据类型选项;其中,优先进行数据补全的数据类型选项,与编辑器服务端优先检测的数据类型相对应。
10.一种代码编辑装置,其中,所述装置应用于编辑器服务端,所述装置包括:
数据补全请求获取模块,用于获取编辑器前端发送的数据补全请求,所述数据补全请求包括代码编辑界面实时的代码变更内容;
代码文档确定模块,用于根据所述代码变更内容,确定所述代码编辑界面实时输入的代码文档;
语法树转化模块,用于将所述代码文档转化为语法树;
解析模块,用于根据所述语法树,解析所述代码文档中当前输入位置的部分代码数据,以及解析所述部分代码数据的数据类型;所述数据类型包括如下任一项:关键字、函数和元数据;所述元数据包括表、字段、库;
候选代码数据确定模块,用于根据所述数据类型,确定匹配所述部分代码数据的候选代码数据;
数据发送模块,用于将所述候选代码数据发送给编辑器前端进行展示。
11.一种代码编辑装置,其中,所述装置应用于编辑器前端,所述装置包括:
编辑界面展示模块,用于展示代码编辑界面;
请求发送模块,用于向编辑器服务端发送数据补全请求,所述数据补全请求包括代码编辑界面实时的代码变更内容;
候选代码数据获取模块,用于获取编辑器服务端基于代码编辑界面的当前输入位置的部分代码数据的数据类型,所反馈的候选代码数据,所述候选代码数据与所述部分代码数据相匹配;所述数据类型包括如下任一项:关键字、函数和元数据;所述元数据包括表、字段、库;
候选代码数据展示模块,用于在所述代码编辑界面展示所述候选代码数据;
选择输入模块,用于从所述候选代码数据中选择输入的目标代码数据。
12.一种编辑器服务端,其中,包括至少一个存储器和至少一个处理器,所述存储器存储一条或多条计算机指令,所述处理器调用所述计算机指令以实现如权利要求1-7任一项所述的代码编辑方法。
13.一种用户设备,其中,所述用户设备运行有编辑器前端,所述用户设备包括至少一个存储器和至少一个处理器,所述存储器存储一条或多条计算机指令,所述处理器调用所述计算机指令以实现如权利要求8-9任一项所述的代码编辑方法。
14.一种存储介质,其中,所述存储介质存储一条或多条计算机指令,所述计算机指令被执行时实现如权利要求1-7任一项所述的代码编辑方法,或者,如权利要求8-9任一项所述的代码编辑方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110418591.4A CN112817583B (zh) | 2021-04-19 | 2021-04-19 | 一种代码编辑方法、装置、服务端、用户设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110418591.4A CN112817583B (zh) | 2021-04-19 | 2021-04-19 | 一种代码编辑方法、装置、服务端、用户设备及存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112817583A true CN112817583A (zh) | 2021-05-18 |
CN112817583B CN112817583B (zh) | 2022-02-01 |
Family
ID=75863704
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110418591.4A Active CN112817583B (zh) | 2021-04-19 | 2021-04-19 | 一种代码编辑方法、装置、服务端、用户设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112817583B (zh) |
Cited By (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113253997A (zh) * | 2021-06-23 | 2021-08-13 | 南京铉盈网络科技有限公司 | 一种图形化前端工程化框架构建方法 |
CN113419721A (zh) * | 2021-08-20 | 2021-09-21 | 杭州未名信科科技有限公司 | 基于web的表达式编辑方法、装置、设备和存储介质 |
CN114115854A (zh) * | 2021-11-29 | 2022-03-01 | 北京百度网讯科技有限公司 | 一种sdk文件生成方法、装置、设备以及存储介质 |
CN114640659A (zh) * | 2022-03-29 | 2022-06-17 | 北京白海科技有限公司 | 一种云端编码辅助方法、装置、电子设备及存储介质 |
CN114895908A (zh) * | 2022-05-17 | 2022-08-12 | 北京志凌海纳科技有限公司 | 基于Web应用表达式的实现方法及系统、设备和存储介质 |
CN117193739A (zh) * | 2023-11-03 | 2023-12-08 | 建信金融科技有限责任公司 | 一种脚本编辑方法和装置 |
CN117289929A (zh) * | 2023-11-24 | 2023-12-26 | 浙江口碑网络技术有限公司 | 一种插件框架、插件及数据处理方法、装置及电子设备 |
CN117289919A (zh) * | 2023-11-24 | 2023-12-26 | 浙江口碑网络技术有限公司 | 一种数据处理方法、装置及电子设备 |
CN117632106A (zh) * | 2023-11-21 | 2024-03-01 | 广州致远电子股份有限公司 | 代码补全方法、装置、设备以及存储介质 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20050015747A1 (en) * | 2003-07-18 | 2005-01-20 | Bea Systems, Inc. | System and method for performing code completion in an integrated development environment |
CN102880468A (zh) * | 2012-09-12 | 2013-01-16 | 浙江大学 | 一种用于ecu程序开发的代码智能提示方法及其系统 |
CN103473105A (zh) * | 2013-09-25 | 2013-12-25 | 北京大学 | 一种在线代码补全功能的实现方法 |
CN105739981A (zh) * | 2016-01-28 | 2016-07-06 | 厦门飞信网络科技有限公司 | 一种代码补全实现方法、装置和计算设备 |
CN112052008A (zh) * | 2020-09-10 | 2020-12-08 | 腾讯科技(深圳)有限公司 | 代码检查方法、装置、计算机设备及计算机可读存储介质 |
-
2021
- 2021-04-19 CN CN202110418591.4A patent/CN112817583B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20050015747A1 (en) * | 2003-07-18 | 2005-01-20 | Bea Systems, Inc. | System and method for performing code completion in an integrated development environment |
CN102880468A (zh) * | 2012-09-12 | 2013-01-16 | 浙江大学 | 一种用于ecu程序开发的代码智能提示方法及其系统 |
CN103473105A (zh) * | 2013-09-25 | 2013-12-25 | 北京大学 | 一种在线代码补全功能的实现方法 |
CN105739981A (zh) * | 2016-01-28 | 2016-07-06 | 厦门飞信网络科技有限公司 | 一种代码补全实现方法、装置和计算设备 |
CN112052008A (zh) * | 2020-09-10 | 2020-12-08 | 腾讯科技(深圳)有限公司 | 代码检查方法、装置、计算机设备及计算机可读存储介质 |
Cited By (14)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113253997A (zh) * | 2021-06-23 | 2021-08-13 | 南京铉盈网络科技有限公司 | 一种图形化前端工程化框架构建方法 |
CN113253997B (zh) * | 2021-06-23 | 2021-10-08 | 南京铉盈网络科技有限公司 | 一种图形化前端工程化框架构建方法 |
CN113419721A (zh) * | 2021-08-20 | 2021-09-21 | 杭州未名信科科技有限公司 | 基于web的表达式编辑方法、装置、设备和存储介质 |
CN114115854A (zh) * | 2021-11-29 | 2022-03-01 | 北京百度网讯科技有限公司 | 一种sdk文件生成方法、装置、设备以及存储介质 |
CN114640659A (zh) * | 2022-03-29 | 2022-06-17 | 北京白海科技有限公司 | 一种云端编码辅助方法、装置、电子设备及存储介质 |
CN114640659B (zh) * | 2022-03-29 | 2023-09-19 | 北京白海科技有限公司 | 一种云端编码辅助方法、装置、电子设备及存储介质 |
CN114895908B (zh) * | 2022-05-17 | 2023-02-28 | 北京志凌海纳科技有限公司 | 基于Web应用表达式的实现方法及系统、设备和存储介质 |
CN114895908A (zh) * | 2022-05-17 | 2022-08-12 | 北京志凌海纳科技有限公司 | 基于Web应用表达式的实现方法及系统、设备和存储介质 |
CN117193739A (zh) * | 2023-11-03 | 2023-12-08 | 建信金融科技有限责任公司 | 一种脚本编辑方法和装置 |
CN117632106A (zh) * | 2023-11-21 | 2024-03-01 | 广州致远电子股份有限公司 | 代码补全方法、装置、设备以及存储介质 |
CN117289929A (zh) * | 2023-11-24 | 2023-12-26 | 浙江口碑网络技术有限公司 | 一种插件框架、插件及数据处理方法、装置及电子设备 |
CN117289919A (zh) * | 2023-11-24 | 2023-12-26 | 浙江口碑网络技术有限公司 | 一种数据处理方法、装置及电子设备 |
CN117289919B (zh) * | 2023-11-24 | 2024-02-20 | 浙江口碑网络技术有限公司 | 一种数据处理方法、装置及电子设备 |
CN117289929B (zh) * | 2023-11-24 | 2024-03-19 | 浙江口碑网络技术有限公司 | 一种插件框架、插件及数据处理方法、装置及电子设备 |
Also Published As
Publication number | Publication date |
---|---|
CN112817583B (zh) | 2022-02-01 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN112817583B (zh) | 一种代码编辑方法、装置、服务端、用户设备及存储介质 | |
US10956834B2 (en) | Tool for machine-learning data analysis | |
JP6714024B2 (ja) | 言語入力データからnグラムおよび概念関係の自動生成 | |
US10776567B2 (en) | Method for compiling page data, method, device and storage medium for page rendering | |
KR100341339B1 (ko) | 디스플레이 스크린 크기 및 윈도우 크기와 관련된 웹 페이지 적응 시스템 | |
JP7130194B2 (ja) | ユーザ意図認識方法、装置、電子機器、コンピュータ可読記憶媒体及びコンピュータプログラム | |
EP1684226A1 (en) | Task oriented user interface model for document centric software applications | |
JP2017208086A (ja) | 自然言語ウェブブラウザ | |
CN111460289B (zh) | 新闻资讯的推送方法和装置 | |
US12008388B2 (en) | Data transfers from memory to manage graphical output latency | |
CN112817876B (zh) | 一种代码诊断方法、装置、服务端、用户设备及存储介质 | |
KR102360262B1 (ko) | 통합 인포메이션의 생성, 푸시 방법, 장치, 단말, 서버 및 매체 | |
CN110532056A (zh) | 一种应用于用户界面中的控件识别方法及装置 | |
CN114065765A (zh) | 结合ai和rpa的武器装备文本处理方法、装置及电子设备 | |
CN115065945B (zh) | 短信链接生成方法、装置、电子设备及存储介质 | |
KR20110017760A (ko) | 멀티미디어 콘텐츠 기술자 추출시스템 및 그 방법 | |
CN114647699A (zh) | 一种数据同步方法、装置、电子设备及存储介质 | |
CN105677827B (zh) | 一种表单的获取方法及装置 | |
CN114003714B (zh) | 一种文档上下文感知的智能知识推送方法 | |
CN115052035B (zh) | 消息推送方法、设备及存储介质 | |
CN113190753B (zh) | 数据采集方法和装置、电子设备、计算机可读介质 | |
JPH1021222A (ja) | 機械翻訳方法及び専門用語辞書選択方法 | |
CN116956828A (zh) | 文档文本的输入方法和装置、存储介质及电子设备 | |
CN112099872A (zh) | 一种基于语音引导的k8s资源创建系统 | |
KR20210043884A (ko) | 전자 장치 및 이의 제어 방법 |
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 |