精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

實例解析:如何開發 VSCode LSP 服務

開發 前端
本文介紹了 VSCode 下,開發一款基于 LSP 的語言插件所需要具備的最最基本的技能,實際開發的時候通常還會混合另一種技術:嵌入式語法 —— Embedded Languages Server ,實現復雜的多語言復合支持。

[[410411]]

從一張動圖說起:

上圖應該大家經常使用的「錯誤診斷」 功能,它能夠在你編寫代碼的過程中提示,那一塊代碼存在什么類型的問題。

這個看似高大上的功能,從插件開發者的角度看其實特別簡單,基本上就是上一篇文章《你不知道的 VSCode 代碼高亮原理》中簡單介紹過的 VSCode 開發語言特性的三種方案:

  • 基于 「Sematic Tokens Provider」 協議的詞法高亮
  • 基于 「Language API」 的編程式語法高亮
  • 基于 「Language Server Protocol」 的多進程架構語法高亮

其中, 「Language Server Protocol」 由于性能與開發效率上的優勢已經逐漸成為主流實現方案,本文接下來會基于 LSP 展開介紹各種語言特性的實現細節,解答 LSP 的通訊模型與開發模式。

示例代碼

本文示例均已同步到 Github,建議讀者先拉下代碼實際體驗:

  1. # 1. clone 示例代碼 
  2. git clone git@github.com:Tecvan-fe/vscode-lsp-sample.git 
  3. # 2. 安裝依賴 
  4. npm i # or yarn 
  5. # 3. 使用 vscode 打開示例代碼 
  6. code ./vscode-lsp-sample 
  7. # 4. 在 vscode 中按下 F5 啟動調試 

順利執行完畢后,可以看到插件的調試窗口:

核心代碼有:

  • server/src/server.ts:LSP 服務端代碼,提供代碼補全、錯誤診斷、代碼提示等常見語言功能的示例
  • client/src/extension.ts:提供一系列 LSP 參數,包括 Server 的調試端口、代碼入口、通訊方式等。
  • packages.json:主要提供了語法插件所需要的配置信息,包括:

activationEvents:聲明插件的激活條件,代碼中的 onLanguage:plaintext 意為打開 txt 文本文件時激活

main:插件的入口文件

其中,client/src/extension.ts 與 packages.json 都比較簡單,本文過多介紹,重點在于 server/src/server.ts 文件,接下來我們逐步拆解,解析不同語言特性的實現細節。

如何編寫 Language Server

Server 結構解析

示例項目的 server/src/server.ts 實現了一個小型但完整的 Language Server 應用,核心代碼:

  1. // 要素1: 初始化 LSP 連接對象 
  2. const connection = createConnection(ProposedFeatures.all); 
  3.  
  4. // 要素2: 創建文檔集合對象,用于映射到實際文檔 
  5. const documents: TextDocuments<TextDocument> = new TextDocuments(TextDocument); 
  6.  
  7. connection.onInitialize((params: InitializeParams) => { 
  8.   // 要素3: 顯式聲明插件支持的語言特性 
  9.   const result: InitializeResult = { 
  10.     capabilities: { 
  11.       hoverProvider: true 
  12.     }, 
  13.   }; 
  14.   return result; 
  15. }); 
  16.  
  17. // 要素4: 將文檔集合對象關聯到連接對象 
  18. documents.listen(connection); 
  19.  
  20. // 要素5: 開始監聽連接對象 
  21. connection.listen(); 

從示例代碼可以總結出 Language Server 的 5 個必要步驟:

  • 創建 connection 對象,用于實現客戶端與服務器之間的信息互通
  • 創建 documents 文檔集合對象,用于映射客戶端正在編輯的文件
  • 在 connection.onInitialize 事件中,顯式聲明插件支持的語法特性,例如上例中返回對象包含 hoverProvider: true 聲明,表示該插件能夠提供代碼懸停提示功能
  • 將 documents 關聯到 connection 對象
  • 調用 connection.listen 函數,開始監聽客戶端消息

上述 connection 、documents 等對象定義在 npm 包:

vscode-languageserver/nodevscode-languageserver-textdocument這是一個基本模板,主要完成了 Language Server 各種初始化操作,后續就可以使用 connection.onXXX 或 documents.onXXX 監聽各類交互事件,并在事件回調中返回符合 LSP 協議的結果,或者顯式調用通訊函數如 connection.sendDiagnostics 發送交互信息。

接下來我們通過幾個簡單實例,分析各項語言特性的實現邏輯。

懸停提示

當鼠標停留在語言元素如函數、變量、符號等 token 時,VSCode 會顯示 token 對應描述與幫助信息:

要實現懸停提示功能,首先需要聲明插件支持 hoverProvider 特性:

  1. connection.onInitialize((params: InitializeParams) => { 
  2.   return { 
  3.     capabilities: { 
  4.       hoverProvider: true 
  5.     }, 
  6.   }; 
  7. }); 

之后,需要監聽 connection.onHover 事件,并在事件回調中返回提示信息:

  1. connection.onHover((params: HoverParams): Promise<Hover> => { 
  2.   return Promise.resolve({ 
  3.     contents: ["Hover Demo"], 
  4.   }); 
  5. }); 

OK,這就是一個很簡單的語言特性示例了,本質上就是監聽事件 + 返回結果,非常簡單。

代碼格式化

代碼格式化是一個特別有用的功能,能夠幫助用戶快速、自動完成代碼的美化處理,實現效果如:

實現懸停提示功能,首先需要聲明插件支持 documentFormattingProvider 特性:

  1.     ... 
  2.     capabilities : { 
  3.         documentFormattingProvider: true 
  4.         ... 
  5.     } 

之后,監聽 onDocumentFormatting 事件:

  1. connection.onDocumentFormatting( 
  2.   (params: DocumentFormattingParams): Promise<TextEdit[]> => { 
  3.     const { textDocument } = params; 
  4.     const doc = documents.get(textDocument.uri)!; 
  5.     const text = doc.getText(); 
  6.     const pattern = /\b[A-Z]{3,}\b/g; 
  7.     let match; 
  8.     const res = []; 
  9.     // 查找連續大寫字符串 
  10.     while ((match = pattern.exec(text))) { 
  11.       res.push({ 
  12.         range: { 
  13.           start: doc.positionAt(match.index), 
  14.           end: doc.positionAt(match.index + match[0].length), 
  15.         }, 
  16.         // 將大寫字符串替換為 駝峰風格 
  17.         newText: match[0].replace(/(?<=[A-Z])[A-Z]+/, (r) => r.toLowerCase()), 
  18.       }); 
  19.     } 
  20.  
  21.     return Promise.resolve(res); 
  22.   } 
  23. ); 

示例代碼中,回調函數主要實現將連續大寫字符串格式化為駝峰字符串,效果如圖:


函數簽名函數簽名特性在用戶輸入函數調用語法時觸發,此時 VSCode 會根據 Language Server 返回的內容,顯示該函數的幫助信息。

實現函數簽名功能,需要首先聲明插件支持 documentFormattingProvider 特性:

  1.     ... 
  2.     capabilities : { 
  3.         signatureHelpProvider: { 
  4.             triggerCharacters: ["("], 
  5.         } 
  6.         ... 
  7.     } 

之后,監聽 onSignatureHelp 事件:

  1. connection.onSignatureHelp( 
  2.   (params: SignatureHelpParams): Promise<SignatureHelp> => { 
  3.     return Promise.resolve({ 
  4.       signatures: [ 
  5.         { 
  6.           label: "Signature Demo"
  7.           documentation: "幫助文檔"
  8.           parameters: [ 
  9.             { 
  10.               label: "@p1 first param"
  11.               documentation: "參數說明"
  12.             }, 
  13.           ], 
  14.         }, 
  15.       ], 
  16.       activeSignature: 0, 
  17.       activeParameter: 0, 
  18.     }); 
  19.   } 
  20. ); 

實現效果:

錯誤提示

注意,錯誤提示的實現邏輯與上述事件 + 響應的模式有一點點不同:

  • 首先不需要通過capabilities 做額外聲明;
  • 監聽的是 documents.onDidChangeContent 事件,而不是 connection 對象上的事件
  • 不是在事件回調中用 return 語句返回錯誤信息,而是調用 connection.sendDiagnostics 發送錯誤消息

完整示例:

  1. // 增量錯誤診斷 
  2. documents.onDidChangeContent((change) => { 
  3.   const textDocument = change.document; 
  4.  
  5.   // The validator creates diagnostics for all uppercase words length 2 and more 
  6.   const text = textDocument.getText(); 
  7.   const pattern = /\b[A-Z]{2,}\b/g; 
  8.   let m: RegExpExecArray | null
  9.  
  10.   let problems = 0; 
  11.   const diagnostics: Diagnostic[] = []; 
  12.   while ((m = pattern.exec(text))) { 
  13.     problems++; 
  14.     const diagnostic: Diagnostic = { 
  15.       severity: DiagnosticSeverity.Warning, 
  16.       range: { 
  17.         start: textDocument.positionAt(m.index), 
  18.         end: textDocument.positionAt(m.index + m[0].length), 
  19.       }, 
  20.       message: `${m[0]} is all uppercase.`, 
  21.       source: "Diagnostics Demo"
  22.     }; 
  23.     diagnostics.push(diagnostic); 
  24.   } 
  25.  
  26.   // Send the computed diagnostics to VSCode. 
  27.   connection.sendDiagnostics({ uri: textDocument.uri, diagnostics }); 
  28. }); 

這段邏輯診斷代碼中是否存在連續大寫字符串,通過 sendDiagnostics 發送相應的錯誤信息,實現效果:

如何識別事件與響應體

上述示例,我有意忽略大多數實現細節,更關注實現語言特性的基本框架和輸入輸出。授人以魚不如授人以漁,所以接下來我們花一點點時間了解從哪里獲取這些接口、參數、響應體的信息。有兩個非常重要的鏈接:

  • https://zjsms.com/egWtqPj/ , VSCode 官網關于可編程語言特性的說明文檔
  • https://zjsms.com/egWVTPg/ ,LSP 協議官網

這兩個網頁提供了 VSCode 所支持的所有語言特性的詳細介紹,可以在這里找到你想要實現的特性的概念性描述,例如對于代碼補齊:


嗯,有點復雜且太過 detail,不過還是很有必要耐心了解下,讓你對即將要做的事情有一個高層概念上的理解。

此外,如果你選擇使用 TS 編寫 LSP,事情會變得更簡單。vscode-languageserver 包提供了非常完善的 Typescript 類型定義,我們完全可以借助 ts + VSCode 的代碼提示找到需要使用的監聽函數:

之后,根據函數簽名找到參數、結果的類型定義:

之后,就可以根據類型定義,有針對性地處理參數,返回對應結構的數據。

深入理解 LSP

看完示例后,我們再反過頭來看看 LSP。LSP —— Language Server Protocol 本質上是一種基于 JSON-RPC 的進程間通訊協議,LSP 本身包含兩大塊內容:

  • 定義 client 與 server 之間的通訊模型,也就是誰、在什么時候、以什么方式向對方發送什么格式的信息,接收方又以什么方式返回響應信息
  • 定義通訊信息體,也就是以什么格式、什么字段、什么樣的值表達信息狀態

作為類比,HTTP 協議專門用于描述網絡節點間如何傳輸、理解超媒體文檔的網絡通訊協議;而 LSP 協議則專門用于描述 IDE 中,用戶行為與響應之間的通訊方式與信息結構。

總結一下,LSP 架構的工作流程如下:

  • 編輯器如 VSCode 跟蹤、計算、管理用戶行為模型,在發生某些特定的行為序列時,以 LSP 協議規定的通訊方式向 Language Server 發送動作與上下文參數
  • Language Server 根據這些參數異步地返回響應信息
  • 編輯器再根據響應信息處理交互反饋

簡單說,編輯器負責與用戶直接交互, Language Server 負責在背后默默計算如何響應用戶的交互動作,兩者以進程粒度分離、解耦,在 LSP 協議框架下各司其職又協作共生。就好像我們通常開發的 Web 應用中,前端負責與用戶交互,服務端負責管理諸如權限、業務數據、業務狀態流轉等不可見的部分。

目前,LSP 協議已經發展到 3.16 版本,覆蓋大多數語言特性,包括:

  • 代碼補全
  • 代碼高亮
  • 定義跳轉
  • 類型推斷
  • 錯誤檢測
  • 等等

得益于 LSP 清晰的設計,這些語言特性的開發套路都很相似,學習曲線很平滑,開發的時候基本上只需要關心監聽那個函數,返回什么格式的結構,可以說掌握上述幾個示例之后就可以很簡單地上手了。

過去,IDE 對語言特性的支持是集成在 IDE 或者以同構插件形式實現的,在 VSCode 中這種同構擴展能力以 「Language API」 或 「Sematic Tokens Provider」 接口方式提供,這兩種方式在上一篇文章《你不知道的 VSCode 代碼高亮原理》都有過介紹了,雖然架構上比較簡單,容易理解,但有一些明顯硬傷:

插件開發者必須復用 VSCode 本身的開發語言、環境,例如 Python 語言插件就必須用 JavaScript 寫

同一個編程語言需要為不同 IDE 重復開發相似的擴展插件,重復投入

LSP 最大的優勢就是將 IDE 客戶端與實際計算交互特性的服務端隔離開來,同一個 Language Service 可以重復應用在多個不同 Language Client 中。

此外,LSP 協議下客戶端、服務器分別在各自進程運行,在性能上也會有正向收益:

確保 UI 進程不卡頓

  • Node 環境下,充分利用多核 CPU 能力

  • 由于不再限定 Language Server 的技術棧,開發者可以選擇更高性能的語言,例如 Go
  • 總的來說,就是很強。

總結

本文介紹了 VSCode 下,開發一款基于 LSP 的語言插件所需要具備的最最基本的技能,實際開發的時候通常還會混合另一種技術:嵌入式語法 —— Embedded Languages Server ,實現復雜的多語言復合支持,如果有人感興趣,我們下周可以聊聊。

 

責任編輯:姜華 來源: Tecvan
相關推薦

2011-09-07 17:54:40

Android Wid開發

2013-02-20 15:29:00

JSONAndroid開發

2009-09-04 16:26:48

C#MSN插件開發

2011-09-07 10:44:36

DHCP服務器配置

2010-04-02 17:45:22

Black Berry

2010-05-08 16:36:16

Windows Pho

2011-04-13 11:16:10

路由器WCCPWeb

2009-09-01 17:08:14

C#畫線控件

2009-08-14 14:17:16

C#Windows服務

2009-08-14 16:24:00

Windows服務程序

2015-03-30 15:15:00

CloudFoundrPaaS開源

2015-03-30 14:57:03

paascloudfoundrservice bro

2011-08-16 10:50:35

DHCP路由器配置

2009-09-23 15:12:41

Hibernate視圖

2011-04-02 11:02:24

2013-12-19 09:43:43

2010-08-02 09:43:00

Flex應用

2009-12-30 16:16:37

建立LSP

2009-09-09 14:40:15

C# XML解析

2019-05-05 11:02:07

vscodevue前端
點贊
收藏

51CTO技術棧公眾號

欧美黄网在线观看| 久久99久久99精品中文字幕 | 国产又黄又粗又猛又爽的视频| 性国裸体高清亚洲| 国产精品视频一二| 成人精品水蜜桃| 销魂美女一区二区| 欧美色123| 一区二区亚洲精品国产| 性生活一级大片| 成人美女视频| 一区二区在线看| 日韩女优中文字幕| 亚洲黄色在线播放| 日韩国产在线观看| 欧美黄色三级网站| 国产视频不卡在线| 大桥未久女教师av一区二区| 色拍拍在线精品视频8848| 免费观看中文字幕| 免费a级毛片在线观看| 极品少妇xxxx精品少妇偷拍| 日本sm极度另类视频| 国产精品九九九九九九| 国产一区二区三区四区二区| 日韩欧美在线影院| 国产又猛又黄的视频| free性欧美| 国产精品美女视频| 日本免费高清不卡| 秋霞视频一区二区| 国产美女娇喘av呻吟久久| 国产91在线播放| 久久久久99精品成人片毛片| 国产精品不卡| 在线看国产精品| free性中国hd国语露脸| 蜜桃在线一区| 欧美日韩国产成人在线免费| 日本中文字幕片| av不卡高清| 亚洲在线中文字幕| 麻豆视频传媒入口| 国产在线高清理伦片a| 欧美国产日韩a欧美在线观看| 亚洲妇女屁股眼交7| 国产精品欧美久久| 国产99对白在线播放| 麻豆免费看一区二区三区| 5566成人精品视频免费| 国产第100页| 国模一区二区三区| 久久91精品国产| 亚洲国产精品久| 午夜国产欧美理论在线播放| 久久资源免费视频| 搜索黄色一级片| 99精品在线免费在线观看| 中文字幕视频一区二区在线有码| 国产熟妇久久777777| 国产精品嫩模av在线| 亚洲人a成www在线影院| 精品人妻少妇嫩草av无码| 乱中年女人伦av一区二区| 欧美成人精品1314www| 中文字幕1234区| 国产精品美女久久久久人| 51精品久久久久久久蜜臀| 午夜大片在线观看| 日韩视频一区二区三区四区| 日韩精品资源二区在线| 男男一级淫片免费播放| 色愁久久久久久| 亚洲男女自偷自拍图片另类| 成熟人妻av无码专区| 日韩欧美精品综合| 欧美成人性色生活仑片| 久久久久久久久久久久久久免费看| 黄色免费成人| 51精品国产黑色丝袜高跟鞋 | 国产精品一级| 国产极品精品在线观看| 亚洲最大成人av| 国产成人精品免费网站| 久久久久久国产精品一区| 高清中文字幕一区二区三区| 亚洲视频免费看| 国产乱淫av片杨贵妃| 天堂av在线| 欧美日韩国产一级| www.男人天堂| 色欧美自拍视频| 欧美大片在线免费观看| 亚洲婷婷综合网| 精油按摩中文字幕久久| 狠狠色狠狠色综合人人| 成人高清免费观看mv| 曰韩精品一区二区| 精品久久久久久久免费人妻| www一区二区三区| 日韩电影在线观看永久视频免费网站| 亚洲一二三四视频| 亚洲精品护士| 成人激情免费在线| 日本一级在线观看| 亚洲男人的天堂在线aⅴ视频| 日韩在线一级片| 精品国产一级| 亚洲一区二区福利| 久久精品视频9| 美女网站色91| 精品无人区一区二区三区竹菊| 午夜激情在线观看| 欧美日韩在线视频观看| 四虎国产精品免费| 色综合久久网| 日韩美女主播视频| 亚洲精品字幕在线| 综合分类小说区另类春色亚洲小说欧美| 国产96在线 | 亚洲| 国产中文欧美日韩在线| 在线日韩精品视频| 你懂的国产在线| 成人综合在线观看| 黑人巨大国产9丨视频| 欧美三级精品| 亚洲精品久久7777777| 在线观看亚洲网站| 另类的小说在线视频另类成人小视频在线 | 伊人久久大香线蕉综合影院首页| 亚洲精品视频网上网址在线观看| 中文字幕第28页| 国产一区91精品张津瑜| 亚洲免费久久| 91精品店在线| 亚洲免费视频一区二区| 亚洲黄色一区二区| 成人福利视频在线看| 天堂а√在线中文在线| 91精品麻豆| 精品国产一区二区三区久久狼黑人| 国产三级精品三级在线观看| 久久综合成人精品亚洲另类欧美| 久无码久无码av无码| 57pao国产一区二区| 欧美激情视频给我| 人妻无码一区二区三区久久99| 亚洲精品高清在线| 四虎国产精品免费| 激情欧美亚洲| 国产偷国产偷亚洲高清97cao| 国产美女情趣调教h一区二区| 日韩欧美精品三级| 久久精品国产亚洲av高清色欲 | 亚洲自拍另类欧美丝袜| 九七电影韩国女主播在线观看| 欧美日韩国产一区| 三级av在线免费观看| 国产精品自拍在线| 免费人成在线观看视频播放| 91精品久久久久久综合五月天| 欧美激情一级精品国产| 农村少妇久久久久久久| 午夜久久久影院| 强伦人妻一区二区三区| 日日欢夜夜爽一区| 亚洲精品影院| 日韩一区二区三区高清在线观看| 欧美激情一区二区久久久| 色综合视频在线| 一本大道综合伊人精品热热| 国产精品久久久视频| 极品少妇xxxx精品少妇偷拍 | 久久免费手机视频| 精品一区二区三区在线观看| 伊人久久在线观看| 欧美黄色录像| 国产精品中文字幕在线| 国产传媒在线播放| 亚洲国产精品久久久久| 蜜臀99久久精品久久久久小说| 国产精品久久久久一区| 潘金莲一级淫片aaaaaaa| 亚洲一区中文| 一区二区高清视频| 高潮按摩久久久久久av免费| 青青在线视频一区二区三区| 免费黄色网页在线观看| 亚洲国产成人91精品| 欧美一级做a爰片免费视频| 亚洲视频免费在线| 玖玖爱在线观看| 国产一区二区精品在线观看| 日本韩国欧美在线观看| 国产精品传媒精东影业在线| 国产欧美日韩综合一区在线观看| 91在线成人| 欧美激情在线狂野欧美精品| www黄在线观看| 亚洲第一视频网| 97人人爽人人爽人人爽| 欧美日韩中文字幕| 2025国产精品自拍| 久久久久久久久免费| 在线成人精品视频| 青娱乐精品在线视频| 欧美国产日韩激情| 91综合久久| 蜜桃免费一区二区三区| 中文字幕一区二区三区中文字幕 | 久久九九精品99国产精品| 亚洲aⅴ乱码精品成人区| 欧美一区二区三区免费大片| 精品国产一区二区三区四| 亚洲一区二区三区国产| 人与动物性xxxx| 久久久精品国产99久久精品芒果| 久久久精品人妻一区二区三区| 免费欧美日韩国产三级电影| 欧美极品欧美精品欧美| 影视一区二区| 一区二区三区av在线| 免费观看久久av| 国产伦精品一区二区三毛| 国产精品视频一区二区三区综合 | 国产精品网站一区| 少妇毛片一区二区三区| 本田岬高潮一区二区三区| 亚洲天堂一区二区在线观看| 免费成人美女在线观看| 日韩精品一区中文字幕| 国产情侣久久| 被灌满精子的波多野结衣| 欧美va天堂| 久久久天堂国产精品| 久久久久免费av| 国产精品99久久久久久大便| 久久婷婷蜜乳一本欲蜜臀| 欧美一区二区三区电影在线观看| 日本欧美韩国国产| 国产一区二区在线观看免费播放| 精品国产导航| 国产99午夜精品一区二区三区| 视频二区欧美毛片免费观看| 91免费人成网站在线观看18| 国产精品va视频| 91热精品视频| 久久伦理中文字幕| 91精品网站| 国产精品午夜av| 精品午夜一区二区| 综合亚洲自拍| 日韩理论片在线观看| 精品成av人一区二区三区| 日韩一区二区三区资源| 日韩免费看片| 中国女人做爰视频| 国内视频精品| www.99热这里只有精品| 久久丁香四色| 国产视频一区免费看| 欧美亚洲尤物久久| 侵犯稚嫩小箩莉h文系列小说| 国产精品久久毛片a| 日本一级片免费| 亚洲精品你懂的| 91人妻一区二区三区蜜臀| 一区二区三区国产精品| 日韩精品国产一区二区| 日韩欧美在线看| 青青在线免费观看| 波多野结衣的一区二区三区| 中文字幕一区二区三区有限公司 | 日韩欧美视频一区二区| 日韩精品中文字幕第1页| 久久久久久久久久久久久国产| 欧美精品首页| 免费在线观看的av网站| 欧美aaaaaa午夜精品| 视频区 图片区 小说区| 99九九99九九九视频精品| 黄色三级生活片| 亚洲免费观看高清完整版在线观看熊 | 91成人免费观看网站| 色综合一本到久久亚洲91| 91久久国产婷婷一区二区| 成人午夜大片| 亚洲二区自拍| 激情综合自拍| 中文字幕视频在线免费观看| 国产成人综合亚洲91猫咪| 国产又黄又粗又猛又爽的视频| 国产精品久久午夜| 国产精品suv一区二区69| 欧美在线免费观看视频| 国产日韩亚洲欧美| 国产精品99久久久久久董美香| 成人av资源| 久久综合电影| 国产91美女视频| 国产毛片一区二区| 无码一区二区三区在线| 亚洲一二三专区| 91tv国产成人福利| 亚洲国产成人av在线| 黄视频网站在线| 国产精品极品尤物在线观看 | 精品少妇一区二区三区在线播放| 国产在线观看高清视频| 欧美日韩国产二区| 国产成人a视频高清在线观看| 国产综合第一页| 亚洲综合五月| 无人在线观看的免费高清视频| 丁香六月久久综合狠狠色| a一级免费视频| 在线免费观看日本一区| 日韩中文字幕综合| 欧美猛少妇色xxxxx| 国产一区影院| 欧美日韩精品久久久免费观看| 免费成人直播| 欧美中文字幕亚洲一区二区va在线| 国产女人高潮时对白| 国产一区二区日韩| 成人小电影网站| 精品一区久久久| 亚洲精品综合| 久久久久亚洲AV成人网人人小说| 国产精品久久久久影院色老大| 日本精品入口免费视频| 亚洲免费人成在线视频观看| 美女视频在线免费| 国产精品永久入口久久久| 中文视频一区| 亚洲一区二区中文字幕在线观看| 国产精品美女久久福利网站| 探花视频在线观看| 亚洲美腿欧美激情另类| 黄在线观看免费网站ktv| 国产美女精品在线观看| 亚洲精品国产日韩| 久久福利小视频| 懂色av一区二区三区| 天堂在线中文字幕| 日韩av手机在线看| 亚洲人和日本人hd| 国产xxxxx视频| 国产午夜精品理论片a级大结局| 国产乱码77777777| 一个色综合导航| 久久久久伊人| 天天综合中文字幕| 国产伦精品一区二区三区在线观看 | 久久久久女教师免费一区| 一区二区三区在线资源| 久青草视频在线播放| 成人黄色在线看| 欧美一级视频免费观看| 亚洲精品视频网上网址在线观看| 亚洲第一二三四区| 亚洲乱码一区二区三区| 狠狠色狠狠色综合系列| 九九视频在线免费观看| 亚洲精品一线二线三线| 亚洲日本天堂| 亚洲欧美日产图| 国产精品性做久久久久久| 日本少妇性高潮| 亚洲欧美精品一区| 欧洲精品久久久久毛片完整版| 在线观看免费黄色片| 北条麻妃国产九九精品视频| 一本一道无码中文字幕精品热| 丝袜一区二区三区| 777久久精品| 无码精品国产一区二区三区免费| 国产精品久久久久三级| 亚洲AV无码乱码国产精品牛牛| 77777少妇光屁股久久一区| av影片在线一区| 成人免费播放视频| 狠狠久久五月精品中文字幕| 日本视频在线播放| 国产精品一区二区三区精品| 视频一区中文字幕| 91精品国产高清一区二区三蜜臀| 亚洲精品国产精品国自产观看浪潮 | 国产不卡123| 亚洲在线www| 国产精品美女| 国产大片免费看| 亚洲精品视频在线播放 | 国产精品三区四区| 天堂va蜜桃一区二区三区 | 欧美视频不卡| jizz中文字幕| 欧美变态凌虐bdsm| 欧美日韩精品一区二区三区视频| 97超碰在线视|