瀏覽代碼

add folding support, update dependendencies

Martin Aeschlimann 7 年之前
父節點
當前提交
8d740b7665
共有 6 個文件被更改,包括 120 次插入121 次删除
  1. 53 47
      package-lock.json
  2. 7 8
      package.json
  3. 4 3
      src/htmlMode.ts
  4. 8 3
      src/htmlWorker.ts
  5. 48 59
      src/languageFeatures.ts
  6. 0 1
      src/monaco.contribution.ts

+ 53 - 47
package-lock.json

@@ -4,16 +4,22 @@
   "lockfileVersion": 1,
   "requires": true,
   "dependencies": {
+    "commander": {
+      "version": "2.16.0",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-2.16.0.tgz",
+      "integrity": "sha512-sVXqklSaotK9at437sFlFpyOcJonxe0yST/AG9DkQKUdIE6IqGIMv4SfAQSKaJbSdVEJYItASCrBiVQHq1HQew==",
+      "dev": true
+    },
     "monaco-editor-core": {
-      "version": "0.12.0",
-      "resolved": "https://registry.npmjs.org/monaco-editor-core/-/monaco-editor-core-0.12.0.tgz",
-      "integrity": "sha512-wOoEVAoZtrarDRcQC32Fp0ocacpQd6/Nb0FmUZOHeD3swZuPZhDLOxTyoNLjKq3d+h/6g+IARBLnDaLT5OQD4g==",
+      "version": "0.13.2",
+      "resolved": "https://registry.npmjs.org/monaco-editor-core/-/monaco-editor-core-0.13.2.tgz",
+      "integrity": "sha512-UwUpmT+37fryykVcfuG/KA3sUV/Siip2V+kzzH/F6gzi6QGAe/A/qvr5sfTALdoW55V5aVpUNctPFUw5Bm1Qeg==",
       "dev": true
     },
     "monaco-languages": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/monaco-languages/-/monaco-languages-1.0.0.tgz",
-      "integrity": "sha512-OKwVZJejt07Wpyy60vptcPueIZRBFOiJT8gfp60O861Pu0HHxhLfNBqeJ5zJ9x4PIbhd5Fq7+tSU+NbnOAfEcA==",
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/monaco-languages/-/monaco-languages-1.3.1.tgz",
+      "integrity": "sha512-zOrUBPBUW7RenUoQocl/O5wPlPVR5Ekb4GstgeCxD8PXM5qfU2djdIgAbxIVIPgoGemrQrKKfPV093T0Ot7n4Q==",
       "dev": true
     },
     "monaco-plugin-helpers": {
@@ -22,13 +28,21 @@
       "integrity": "sha512-7kUx8dtd5qVNVgUARBRhnM8oftPglYwlINfigC4yGUiuzqtIN22u1tly8umiOCIPR0eFiBLjt6aN23oZh2QJgg==",
       "dev": true,
       "requires": {
-        "typescript": "2.7.2"
+        "typescript": "^2.7.2"
+      },
+      "dependencies": {
+        "typescript": {
+          "version": "2.9.2",
+          "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz",
+          "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==",
+          "dev": true
+        }
       }
     },
     "monaco-typescript": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/monaco-typescript/-/monaco-typescript-3.0.0.tgz",
-      "integrity": "sha512-eqxb5wG/HtL+Y/Taedh4RzxyaXDJc2YXOizgpr4X+KRHhg+mKOkcJ5QglHs/yQrVisY1CKsF/A66hTnVOaxDbg==",
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/monaco-typescript/-/monaco-typescript-3.1.0.tgz",
+      "integrity": "sha512-GQWDKoXVrh4r0TpjJuRTpGEDeyN0/bqel4Op08CV0bpFL4xifFDfLPAyGeDPJiSlapaY5i+shC6VK0JELfE1OQ==",
       "dev": true
     },
     "requirejs": {
@@ -37,63 +51,55 @@
       "integrity": "sha512-svnO+aNcR/an9Dpi44C7KSAy5fFGLtmPbaaCeQaklUz8BQhS64tWWIIlvEA5jrWICzlO/X9KSzSeXFnZdBu8nw==",
       "dev": true
     },
+    "source-map": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+      "dev": true
+    },
     "typescript": {
-      "version": "2.7.2",
-      "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.7.2.tgz",
-      "integrity": "sha512-p5TCYZDAO0m4G344hD+wx/LATebLWZNkkh2asWUFqSsD2OrDNhbAHuSjobrmsUmdzjJjEeZVU9g1h3O6vpstnw==",
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.0.1.tgz",
+      "integrity": "sha512-zQIMOmC+372pC/CCVLqnQ0zSBiY7HHodU7mpQdjiZddek4GMj31I3dUJ7gAs9o65X7mnRma6OokOkc6f9jjfBg==",
       "dev": true
     },
     "uglify-js": {
-      "version": "3.3.14",
-      "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.3.14.tgz",
-      "integrity": "sha512-OY8VPQU25q09gQRbC+Ekk3xgEVBmYFEfVcgS47ksjTiNht2LmLlUkWutyi38ZsDSToJHwbe76kDGwmD226Z2Fg==",
+      "version": "3.4.6",
+      "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.6.tgz",
+      "integrity": "sha512-O1D7L6WcOzS1qW2ehopEm4cWm5yA6bQBozlks8jO8ODxYCy4zv+bR/la4Lwp01tpkYGNonnpXvUpYtrvSu8Yzg==",
       "dev": true,
       "requires": {
-        "commander": "2.14.1",
-        "source-map": "0.6.1"
-      },
-      "dependencies": {
-        "commander": {
-          "version": "2.14.1",
-          "resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz",
-          "integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw==",
-          "dev": true
-        },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
-        }
+        "commander": "~2.16.0",
+        "source-map": "~0.6.1"
       }
     },
     "vscode-html-languageservice": {
-      "version": "2.1.3-next.5",
-      "resolved": "https://registry.npmjs.org/vscode-html-languageservice/-/vscode-html-languageservice-2.1.3-next.5.tgz",
-      "integrity": "sha512-1xAdHIUY5LsfnRm0Slks7QX168MHmjBCxr0RlResVDFcDmsuYQ9WUHlyTk4JPF/wTONCCk9/KL3jfDqBNEXrxQ==",
+      "version": "2.1.4",
+      "resolved": "https://registry.npmjs.org/vscode-html-languageservice/-/vscode-html-languageservice-2.1.4.tgz",
+      "integrity": "sha512-3SMcTOaiqFTCiHOeAFbHcBSsAgJA81q9PrRdOR7b5LQhkGDUwL5FEETp9gzd+A4c1Bxe14Zu51bY7+jwfTnfzA==",
       "dev": true,
       "requires": {
-        "vscode-languageserver-types": "3.7.2",
-        "vscode-nls": "3.2.2",
-        "vscode-uri": "1.0.3"
+        "vscode-languageserver-types": "^3.10.0",
+        "vscode-nls": "^3.2.4",
+        "vscode-uri": "^1.0.5"
       }
     },
     "vscode-languageserver-types": {
-      "version": "3.7.2",
-      "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.7.2.tgz",
-      "integrity": "sha512-L9D2RA+PDS2CiyhLQY5ZrOmyRvXyjc4Ha8s9PqS6mIgGxj00R5Xx2vLKBnAOVfrawJXYZST+2hioMks6SQVU7A==",
+      "version": "3.10.0",
+      "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.10.0.tgz",
+      "integrity": "sha512-vxmCsVZGwq8X40SuLP8Ix7V0rq5V/7iQUjRVe2Oxm+TbmjxtjK4dpHHXQCUawjA4fhPA9FwjSRbDhbvQmYCfMw==",
       "dev": true
     },
     "vscode-nls": {
-      "version": "3.2.2",
-      "resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-3.2.2.tgz",
-      "integrity": "sha512-/Ur1+tgazwd51+ncRyoy0UIu4dvMdVXS9XMUULQlZIBoNGEwOhwEx9x+hHWoUjldMrOQ32t2CGKo0u6D4R6/hg==",
+      "version": "3.2.4",
+      "resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-3.2.4.tgz",
+      "integrity": "sha512-FTjdqa4jDDoBjJqr36O8lmmZf/55kQ2w4ZY/+GL6K92fq765BqO3aYw21atnXUno/P04V5DWagNl4ybDIndJsw==",
       "dev": true
     },
     "vscode-uri": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.3.tgz",
-      "integrity": "sha1-Yxvb9xbcyrDmUpGo3CXCMjIIWlI=",
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.5.tgz",
+      "integrity": "sha1-O4majvccN/MFTXm9vdoxx7828g0=",
       "dev": true
     }
   }

+ 7 - 8
package.json

@@ -19,15 +19,14 @@
     "url": "https://github.com/Microsoft/monaco-editor/issues"
   },
   "devDependencies": {
-    "monaco-editor-core": "0.12.0",
-    "monaco-languages": "^1.0.0",
+    "monaco-editor-core": "0.13.2",
+    "monaco-languages": "^1.3.1",
     "monaco-plugin-helpers": "^1.0.2",
-    "monaco-typescript": "^3.0.0",
+    "monaco-typescript": "^3.1.0",
     "requirejs": "^2.3.5",
-    "typescript": "2.7.2",
-    "uglify-js": "^3.3.14",
-    "vscode-html-languageservice": "2.1.3-next.5",
-    "vscode-languageserver-types": "^3.7.2",
-    "vscode-nls": "^3.2.2"
+    "typescript": "^3.0.1",
+    "uglify-js": "^3.4.6",
+    "vscode-html-languageservice": "^2.1.4",
+    "vscode-languageserver-types": "^3.10.0"
   }
 }

+ 4 - 3
src/htmlMode.ts

@@ -4,9 +4,9 @@
  *--------------------------------------------------------------------------------------------*/
 'use strict';
 
-import {WorkerManager} from './workerManager';
-import {HTMLWorker} from './htmlWorker';
-import {LanguageServiceDefaultsImpl} from './monaco.contribution';
+import { WorkerManager } from './workerManager';
+import { HTMLWorker } from './htmlWorker';
+import { LanguageServiceDefaultsImpl } from './monaco.contribution';
 import * as languageFeatures from './languageFeatures';
 
 import Promise = monaco.Promise;
@@ -26,6 +26,7 @@ export function setupMode(defaults: LanguageServiceDefaultsImpl): void {
 	monaco.languages.registerCompletionItemProvider(languageId, new languageFeatures.CompletionAdapter(worker));
 	monaco.languages.registerDocumentHighlightProvider(languageId, new languageFeatures.DocumentHighlightAdapter(worker));
 	monaco.languages.registerLinkProvider(languageId, new languageFeatures.DocumentLinkAdapter(worker));
+	monaco.languages.registerFoldingRangeProvider(languageId, new languageFeatures.FoldingRangeAdapter(worker));
 
 	// only html
 	if (languageId === 'html') {

+ 8 - 3
src/htmlWorker.ts

@@ -15,12 +15,12 @@ import * as ls from 'vscode-languageserver-types';
 
 export class HTMLWorker {
 
-	private _ctx:IWorkerContext;
+	private _ctx: IWorkerContext;
 	private _languageService: htmlService.LanguageService;
 	private _languageSettings: monaco.languages.html.Options;
 	private _languageId: string;
 
-	constructor(ctx:IWorkerContext, createData: ICreateData) {
+	constructor(ctx: IWorkerContext, createData: ICreateData) {
 		this._ctx = ctx;
 		this._languageSettings = createData.languageSettings;
 		this._languageId = createData.languageId;
@@ -52,6 +52,11 @@ export class HTMLWorker {
 		let links = this._languageService.findDocumentLinks(document, null);
 		return Promise.as(links);
 	}
+	provideFoldingRanges(uri: string, context?: { rangeLimit?: number; }): Thenable<ls.FoldingRange[]> {
+		let document = this._getTextDocument(uri);
+		let ranges = this._languageService.getFoldingRanges(document, context);
+		return Promise.as(ranges);
+	}
 	private _getTextDocument(uri: string): ls.TextDocument {
 		let models = this._ctx.getMirrorModels();
 		for (let model of models) {
@@ -68,6 +73,6 @@ export interface ICreateData {
 	languageSettings: monaco.languages.html.Options;
 }
 
-export function create(ctx:IWorkerContext, createData: ICreateData): HTMLWorker {
+export function create(ctx: IWorkerContext, createData: ICreateData): HTMLWorker {
 	return new HTMLWorker(ctx, createData);
 }

+ 48 - 59
src/languageFeatures.ts

@@ -4,8 +4,8 @@
  *--------------------------------------------------------------------------------------------*/
 'use strict';
 
-import {LanguageServiceDefaultsImpl} from './monaco.contribution';
-import {HTMLWorker} from './htmlWorker';
+import { LanguageServiceDefaultsImpl } from './monaco.contribution';
+import { HTMLWorker } from './htmlWorker';
 
 import * as ls from 'vscode-languageserver-types';
 
@@ -48,11 +48,11 @@ export class DiagnosticsAdapter {
 		const onModelRemoved = (model: monaco.editor.IModel): void => {
 			monaco.editor.setModelMarkers(model, this._languageId, []);
 			let uriStr = model.uri.toString();
- 			let listener = this._listener[uriStr];
- 			if (listener) {
- 				listener.dispose();
- 				delete this._listener[uriStr];
- 			}
+			let listener = this._listener[uriStr];
+			if (listener) {
+				listener.dispose();
+				delete this._listener[uriStr];
+			}
 		};
 
 		this._disposables.push(monaco.editor.onDidCreateModel(onModelAdd));
@@ -239,7 +239,7 @@ function fromMarkdownString(entry: string | monaco.IMarkdownString): ls.MarkupCo
 }
 
 function fromCompletionItem(entry: DataCompletionItem): ls.CompletionItem {
-	let item : ls.CompletionItem = {
+	let item: ls.CompletionItem = {
 		label: entry.label,
 		sortText: entry.sortText,
 		filterText: entry.filterText,
@@ -252,7 +252,7 @@ function fromCompletionItem(entry: DataCompletionItem): ls.CompletionItem {
 		item.insertText = entry.insertText.value;
 		item.insertTextFormat = ls.InsertTextFormat.Snippet
 	} else {
-		item.insertText = <string> entry.insertText;
+		item.insertText = <string>entry.insertText;
 	}
 	if (entry.range) {
 		item.textEdit = ls.TextEdit.replace(fromRange(entry.range), item.insertText);
@@ -281,7 +281,7 @@ export class CompletionAdapter implements monaco.languages.CompletionItemProvide
 				return;
 			}
 			let items: monaco.languages.CompletionItem[] = info.items.map(entry => {
-				let item : monaco.languages.CompletionItem = {
+				let item: monaco.languages.CompletionItem = {
 					label: entry.label,
 					insertText: entry.insertText,
 					sortText: entry.sortText,
@@ -295,7 +295,7 @@ export class CompletionAdapter implements monaco.languages.CompletionItemProvide
 					item.insertText = entry.textEdit.newText;
 				}
 				if (entry.insertTextFormat === ls.InsertTextFormat.Snippet) {
-					item.insertText = { value: <string> item.insertText };
+					item.insertText = { value: <string>item.insertText };
 				}
 				return item;
 			});
@@ -332,54 +332,7 @@ function toMarkdownString(entry: ls.MarkupContent | ls.MarkedString): monaco.IMa
 	return { value: '```' + entry.language + '\n' + entry.value + '\n```\n' };
 }
 
-function toMarkedStringArray(contents: ls.MarkedString | ls.MarkedString[]): monaco.IMarkdownString[] {
-	if (!contents) {
-		return void 0;
-	}
-	if (Array.isArray(contents)) {
-		return contents.map(toMarkdownString);
-	}
-	return [toMarkdownString(contents)];
-}
-
-
-// --- definition ------
-
-function toLocation(location: ls.Location): monaco.languages.Location {
-	return {
-		uri: Uri.parse(location.uri),
-		range: toRange(location.range)
-	};
-}
-
 
-// --- document symbols ------
-
-function toSymbolKind(kind: ls.SymbolKind): monaco.languages.SymbolKind {
-	let mKind = monaco.languages.SymbolKind;
-
-	switch (kind) {
-		case ls.SymbolKind.File: return mKind.Array;
-		case ls.SymbolKind.Module: return mKind.Module;
-		case ls.SymbolKind.Namespace: return mKind.Namespace;
-		case ls.SymbolKind.Package: return mKind.Package;
-		case ls.SymbolKind.Class: return mKind.Class;
-		case ls.SymbolKind.Method: return mKind.Method;
-		case ls.SymbolKind.Property: return mKind.Property;
-		case ls.SymbolKind.Field: return mKind.Field;
-		case ls.SymbolKind.Constructor: return mKind.Constructor;
-		case ls.SymbolKind.Enum: return mKind.Enum;
-		case ls.SymbolKind.Interface: return mKind.Interface;
-		case ls.SymbolKind.Function: return mKind.Function;
-		case ls.SymbolKind.Variable: return mKind.Variable;
-		case ls.SymbolKind.Constant: return mKind.Constant;
-		case ls.SymbolKind.String: return mKind.String;
-		case ls.SymbolKind.Number: return mKind.Number;
-		case ls.SymbolKind.Boolean: return mKind.Boolean;
-		case ls.SymbolKind.Array: return mKind.Array;
-	}
-	return mKind.Function;
-}
 
 function toHighlighKind(kind: ls.DocumentHighlightKind): monaco.languages.DocumentHighlightKind {
 	let mKind = monaco.languages.DocumentHighlightKind;
@@ -437,7 +390,7 @@ export class DocumentLinkAdapter implements monaco.languages.LinkProvider {
 function fromFormattingOptions(options: monaco.languages.FormattingOptions): ls.FormattingOptions {
 	return {
 		tabSize: options.tabSize,
-        insertSpaces: options.insertSpaces
+		insertSpaces: options.insertSpaces
 	};
 }
 
@@ -479,6 +432,42 @@ export class DocumentRangeFormattingEditProvider implements monaco.languages.Doc
 	}
 }
 
+export class FoldingRangeAdapter implements monaco.languages.FoldingRangeProvider {
+
+	constructor(private _worker: WorkerAccessor) {
+	}
+
+	public provideFoldingRanges(model: monaco.editor.IReadOnlyModel, context: monaco.languages.FoldingContext, token: CancellationToken): Thenable<monaco.languages.FoldingRange[]> {
+		const resource = model.uri;
+
+		return wireCancellationToken(token, this._worker(resource).then(worker => worker.provideFoldingRanges(resource.toString(), context)).then(ranges => {
+			if (!ranges) {
+				return;
+			}
+			return ranges.map(range => {
+				let result: monaco.languages.FoldingRange = {
+					start: range.startLine,
+					end: range.endLine
+				};
+				if (typeof range.kind !== 'undefined') {
+					result.kind = toFoldingRangeKind(<ls.FoldingRangeKind>range.kind);
+				}
+				return result;
+			});
+		}));
+	}
+
+}
+
+function toFoldingRangeKind(kind: ls.FoldingRangeKind): monaco.languages.FoldingRangeKind {
+	switch (kind) {
+		case ls.FoldingRangeKind.Comment: return monaco.languages.FoldingRangeKind.Comment;
+		case ls.FoldingRangeKind.Imports: return monaco.languages.FoldingRangeKind.Imports;
+		case ls.FoldingRangeKind.Region: return monaco.languages.FoldingRangeKind.Region;
+	}
+	return void 0;
+}
+
 /**
  * Hook a cancellation token to a WinJS Promise
  */

+ 0 - 1
src/monaco.contribution.ts

@@ -8,7 +8,6 @@ import * as mode from './htmlMode';
 
 import Emitter = monaco.Emitter;
 import IEvent = monaco.IEvent;
-import IDisposable = monaco.IDisposable;
 
 // --- HTML configuration and defaults ---------