diff --git a/README.md b/README.md index bb9e1156..b28ab669 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,9 @@ -<<<<<<< dc598757e71a1ee33423bd24c3cb1b4b849722e6 -# monaco-css -CSS language support for the Monaco editor -======= -# Monaco TypeScript - -TypeScript and JavaScript language support for the Monaco Editor. - -![typescript](https://cloud.githubusercontent.com/assets/5047891/15926623/5262fe08-2e3d-11e6-9b90-1d43fda07178.gif) +# monaco-css +CSS language support for the Monaco Editor. ## Installing This npm module is bundled and distributed in the [monaco-editor](https://www.npmjs.com/package/monaco-editor) npm module. ## License -[MIT](https://github.com/Microsoft/monaco-typescript/blob/master/LICENSE.md) ->>>>>>> Init +[MIT](https://github.com/Microsoft/monaco-css/blob/master/LICENSE.md) diff --git a/gulpfile.js b/gulpfile.js index 753a5bca..8714e086 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -24,9 +24,9 @@ gulp.task('release', ['clean-release','compile'], function() { var BUNDLED_FILE_HEADER = [ '/*!-----------------------------------------------------------------------------', ' * Copyright (c) Microsoft Corporation. All rights reserved.', - ' * monaco-typescript version: ' + headerVersion, + ' * monaco-css version: ' + headerVersion, ' * Released under the MIT license', - ' * https://github.com/Microsoft/monaco-typescript/blob/master/LICENSE.md', + ' * https://github.com/Microsoft/monaco-css/blob/master/LICENSE.md', ' *-----------------------------------------------------------------------------*/', '' ].join('\n'); @@ -38,22 +38,33 @@ gulp.task('release', ['clean-release','compile'], function() { out: moduleId + '.js', exclude: exclude, paths: { - 'vs/language/css': __dirname + '/out', - 'vscode-css-languageservice/lib': __dirname + '/node_modules/vscode-css-languageservice/lib', - 'vscode-languageserver-types/lib': __dirname + '/node_modules/vscode-languageserver-types/lib' - } + 'vs/language/css': __dirname + '/out' + }, + packages: [{ + name: 'vscode-css-languageservice', + location: __dirname + '/node_modules/vscode-css-languageservice/lib', + main: 'cssLanguageService' + }, { + name: 'vscode-languageserver-types', + location: __dirname + '/node_modules/vscode-languageserver-types/lib', + main: 'main' + }, { + name: 'vscode-nls', + location: __dirname + '/out/fillers', + main: 'vscode-nls' + }] }) } return merge( merge( - bundleOne('monaco.contribution'), + bundleOne('monaco.contribution', ['vs/language/css/mode']), bundleOne('mode'), bundleOne('worker') ) - .pipe(uglify({ - preserveComments: 'some' - })) + // .pipe(uglify({ + // preserveComments: 'some' + // })) .pipe(es.through(function(data) { data.contents = new Buffer( BUNDLED_FILE_HEADER diff --git a/src/fillers/vscode-nls.ts b/src/fillers/vscode-nls.ts new file mode 100644 index 00000000..b9566a77 --- /dev/null +++ b/src/fillers/vscode-nls.ts @@ -0,0 +1,34 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import {LocalizeInfo, LocalizeFunc, Options, LoadFunc} from 'vscode-nls'; + +export {LocalizeInfo, LocalizeFunc, Options, LoadFunc}; + +function format(message: string, args: any[]): string { + let result:string; + + if (args.length === 0) { + result = message; + } else { + result = message.replace(/\{(\d+)\}/g, (match, rest) => { + let index = rest[0]; + return typeof args[index] !== 'undefined' ? args[index] : match; + }); + } + return result; +} + +function localize(key: string | LocalizeInfo, message: string, ...args: any[]): string { + return format(message, args); +} + +export function loadMessageBundle(file?: string): LocalizeFunc { + return localize; +} + +export function config(opt?: Options | string): LoadFunc { + return loadMessageBundle; +} \ No newline at end of file diff --git a/src/languageFeatures.ts b/src/languageFeatures.ts index 6e1fe4a6..f1f297a1 100644 --- a/src/languageFeatures.ts +++ b/src/languageFeatures.ts @@ -7,9 +7,7 @@ import {LanguageServiceDefaultsImpl} from './monaco.contribution'; import {CSSWorker} from './worker'; -import * as cssService from 'vscode-css-languageservice/lib/cssLanguageService'; -import * as ls from 'vscode-languageserver-types/lib/main'; - +import * as ls from 'vscode-languageserver-types'; import Uri = monaco.Uri; import Position = monaco.Position; @@ -20,6 +18,10 @@ import CancellationToken = monaco.CancellationToken; import IDisposable = monaco.IDisposable; +export interface WorkerAccessor { + (first: Uri, ...more: Uri[]): Promise +} + // --- diagnostics --- --- export class DiagnostcsAdapter { @@ -27,10 +29,7 @@ export class DiagnostcsAdapter { private _disposables: IDisposable[] = []; private _listener: { [uri: string]: IDisposable } = Object.create(null); - constructor(private _defaults: LanguageServiceDefaultsImpl, private _languageId: string, - private _worker: (first: Uri, ...more: Uri[]) => Promise - ) { - + constructor(private _languageId: string, private _worker: WorkerAccessor) { const onModelAdd = (model: monaco.editor.IModel): void => { let modeId = model.getModeId(); if (modeId !== this._languageId) { @@ -112,7 +111,7 @@ function toDiagnostics(resource: Uri, diag: ls.Diagnostic): monaco.editor.IMarke }; } -// --- suggest ------ +// --- completion ------ function fromPosition(position: Position): ls.Position { if (!position) { @@ -174,7 +173,7 @@ function toTextEdit(textEdit: ls.TextEdit): monaco.editor.ISingleEditOperation { export class CompletionAdapter implements monaco.languages.CompletionItemProvider { - constructor(private _worker: (first: Uri, ...more: Uri[]) => Promise) { + constructor(private _worker: WorkerAccessor) { } public get triggerCharacters(): string[] { @@ -193,7 +192,8 @@ export class CompletionAdapter implements monaco.languages.CompletionItemProvide } let items: monaco.languages.CompletionItem[] = info.items.map(entry => { return { - label: entry.insertText, + label: entry.label, + insertText: entry.insertText, sortText: entry.sortText, filterText: entry.filterText, documentation: entry.documentation, @@ -238,7 +238,7 @@ function toHTMLContentElements(contents: ls.MarkedString | ls.MarkedString[]): m export class HoverAdapter implements monaco.languages.HoverProvider { - constructor(private _worker: (first: Uri, ...more: Uri[]) => Promise) { + constructor(private _worker: WorkerAccessor) { } provideHover(model: monaco.editor.IReadOnlyModel, position: Position, token: CancellationToken): Thenable { @@ -258,7 +258,7 @@ export class HoverAdapter implements monaco.languages.HoverProvider { } } -// --- occurrences ------ +// --- document highlights ------ function toDocumentHighlightKind(kind: number): monaco.languages.DocumentHighlightKind { switch (kind) { @@ -272,7 +272,7 @@ function toDocumentHighlightKind(kind: number): monaco.languages.DocumentHighlig export class DocumentHighlightAdapter implements monaco.languages.DocumentHighlightProvider { - constructor(private _worker: (first: Uri, ...more: Uri[]) => Promise) { + constructor(private _worker: WorkerAccessor) { } public provideDocumentHighlights(model: monaco.editor.IReadOnlyModel, position: Position, token: CancellationToken): Thenable { @@ -305,7 +305,7 @@ function toLocation(location: ls.Location): monaco.languages.Location { export class DefinitionAdapter { - constructor(private _worker: (first: Uri, ...more: Uri[]) => Promise) { + constructor(private _worker: WorkerAccessor) { } public provideDefinition(model: monaco.editor.IReadOnlyModel, position: Position, token: CancellationToken): Thenable { @@ -326,7 +326,7 @@ export class DefinitionAdapter { export class ReferenceAdapter implements monaco.languages.ReferenceProvider { - constructor(private _worker: (first: Uri, ...more: Uri[]) => Promise) { + constructor(private _worker: WorkerAccessor) { } provideReferences(model: monaco.editor.IReadOnlyModel, position: Position, context: monaco.languages.ReferenceContext, token: CancellationToken): Thenable { @@ -349,11 +349,11 @@ function toWorkspaceEdit(edit: ls.WorkspaceEdit): monaco.languages.WorkspaceEdit if (!edit || !edit.changes) { return void 0; } - let resourceEdits : monaco.languages.IResourceEdit[] = []; + let resourceEdits: monaco.languages.IResourceEdit[] = []; for (let uri in edit.changes) { let edits = edit.changes[uri]; for (let e of edits) { - resourceEdits.push({resource: Uri.parse(uri), range: toRange(e.range), newText: e.newText }); + resourceEdits.push({ resource: Uri.parse(uri), range: toRange(e.range), newText: e.newText }); } } @@ -365,7 +365,7 @@ function toWorkspaceEdit(edit: ls.WorkspaceEdit): monaco.languages.WorkspaceEdit export class RenameAdapter implements monaco.languages.RenameProvider { - constructor(private _worker: (first: Uri, ...more: Uri[]) => Promise) { + constructor(private _worker: WorkerAccessor) { } provideRenameEdits(model: monaco.editor.IReadOnlyModel, position: Position, newName: string, token: CancellationToken): Thenable { @@ -379,7 +379,7 @@ export class RenameAdapter implements monaco.languages.RenameProvider { } } -// --- outline ------ +// --- document symbols ------ function toSymbolKind(kind: ls.SymbolKind): monaco.languages.SymbolKind { let lsKind = ls.SymbolKind; @@ -411,7 +411,7 @@ function toSymbolKind(kind: ls.SymbolKind): monaco.languages.SymbolKind { export class DocumentSymbolAdapter implements monaco.languages.DocumentSymbolProvider { - constructor(private _worker: (first: Uri, ...more: Uri[]) => Promise) { + constructor(private _worker: WorkerAccessor) { } public provideDocumentSymbols(model: monaco.editor.IReadOnlyModel, token: CancellationToken): Thenable { diff --git a/src/mode.ts b/src/mode.ts index 3ee26df8..08da000a 100644 --- a/src/mode.ts +++ b/src/mode.ts @@ -38,7 +38,6 @@ export function setupCSS(defaults:LanguageServiceDefaultsImpl): void { setupMode( defaults, - 'css', cssLanguageConfiguration ); } @@ -63,7 +62,6 @@ export function setupLESS(defaults:LanguageServiceDefaultsImpl): void { setupMode( defaults, - 'less', lessLanguageConfiguration ); } @@ -88,12 +86,11 @@ export function setupSCSS(defaults:LanguageServiceDefaultsImpl): void { setupMode( defaults, - 'scss', scssLanguageConfiguration ); } -function setupMode(defaults:LanguageServiceDefaultsImpl, modeId:string, languageConfiguration: monaco.languages.LanguageConfiguration): void { +function setupMode(defaults:LanguageServiceDefaultsImpl, languageConfiguration: monaco.languages.LanguageConfiguration): void { let disposables: IDisposable[] = []; @@ -104,15 +101,17 @@ function setupMode(defaults:LanguageServiceDefaultsImpl, modeId:string, language return client.getLanguageServiceWorker(...[first].concat(more)); }; - disposables.push(monaco.languages.registerCompletionItemProvider(modeId, new languageFeatures.CompletionAdapter(worker))); - disposables.push(monaco.languages.registerHoverProvider(modeId, new languageFeatures.HoverAdapter(worker))); - disposables.push(monaco.languages.registerDocumentHighlightProvider(modeId, new languageFeatures.DocumentHighlightAdapter(worker))); - disposables.push(monaco.languages.registerDefinitionProvider(modeId, new languageFeatures.DefinitionAdapter(worker))); - disposables.push(monaco.languages.registerReferenceProvider(modeId, new languageFeatures.ReferenceAdapter(worker))); - disposables.push(monaco.languages.registerDocumentSymbolProvider(modeId, new languageFeatures.DocumentSymbolAdapter(worker))); - disposables.push(monaco.languages.registerRenameProvider(modeId, new languageFeatures.RenameAdapter(worker))); - disposables.push(new languageFeatures.DiagnostcsAdapter(defaults, modeId, worker)); - disposables.push(monaco.languages.setLanguageConfiguration(modeId, languageConfiguration)); + let languageId = defaults.languageId; + + disposables.push(monaco.languages.registerCompletionItemProvider(languageId, new languageFeatures.CompletionAdapter(worker))); + disposables.push(monaco.languages.registerHoverProvider(languageId, new languageFeatures.HoverAdapter(worker))); + disposables.push(monaco.languages.registerDocumentHighlightProvider(languageId, new languageFeatures.DocumentHighlightAdapter(worker))); + disposables.push(monaco.languages.registerDefinitionProvider(languageId, new languageFeatures.DefinitionAdapter(worker))); + disposables.push(monaco.languages.registerReferenceProvider(languageId, new languageFeatures.ReferenceAdapter(worker))); + disposables.push(monaco.languages.registerDocumentSymbolProvider(languageId, new languageFeatures.DocumentSymbolAdapter(worker))); + disposables.push(monaco.languages.registerRenameProvider(languageId, new languageFeatures.RenameAdapter(worker))); + disposables.push(new languageFeatures.DiagnostcsAdapter(languageId, worker)); + disposables.push(monaco.languages.setLanguageConfiguration(languageId, languageConfiguration)); } diff --git a/src/monaco.contribution.ts b/src/monaco.contribution.ts index ec0842c7..950ace93 100644 --- a/src/monaco.contribution.ts +++ b/src/monaco.contribution.ts @@ -18,8 +18,10 @@ export class LanguageServiceDefaultsImpl implements monaco.languages.css.Languag private _onDidChange = new Emitter(); private _diagnosticsOptions: monaco.languages.css.DiagnosticsOptions; + private _languageId: string; - constructor(diagnosticsOptions: monaco.languages.css.DiagnosticsOptions) { + constructor(languageId: string, diagnosticsOptions: monaco.languages.css.DiagnosticsOptions) { + this._languageId = languageId; this.setDiagnosticsOptions(diagnosticsOptions); } @@ -27,6 +29,10 @@ export class LanguageServiceDefaultsImpl implements monaco.languages.css.Languag return this._onDidChange.event; } + get languageId(): string { + return this._languageId; + } + get diagnosticsOptions(): monaco.languages.css.DiagnosticsOptions { return this._diagnosticsOptions; } @@ -61,9 +67,9 @@ const diagnosticDefault : monaco.languages.css.DiagnosticsOptions = { } } -const cssDefaults = new LanguageServiceDefaultsImpl(diagnosticDefault); -const scssDefaults = new LanguageServiceDefaultsImpl(diagnosticDefault); -const lessDefaults = new LanguageServiceDefaultsImpl(diagnosticDefault); +const cssDefaults = new LanguageServiceDefaultsImpl('css', diagnosticDefault); +const scssDefaults = new LanguageServiceDefaultsImpl('scss', diagnosticDefault); +const lessDefaults = new LanguageServiceDefaultsImpl('less', diagnosticDefault); // Export API diff --git a/src/worker.ts b/src/worker.ts index 79bf593f..6ee9065b 100644 --- a/src/worker.ts +++ b/src/worker.ts @@ -6,8 +6,8 @@ import Promise = monaco.Promise; -import * as cssService from 'vscode-css-languageservice/lib/cssLanguageService'; -import * as ls from 'vscode-languageserver-types/lib/main'; +import * as cssService from 'vscode-css-languageservice'; +import * as ls from 'vscode-languageserver-types'; export class CSSWorker { diff --git a/src/workerManager.ts b/src/workerManager.ts index 4c4400d4..12141dbf 100644 --- a/src/workerManager.ts +++ b/src/workerManager.ts @@ -62,11 +62,12 @@ export class WorkerManager { this._worker = monaco.editor.createWebWorker({ // module that exports the create() method and returns a `CSSWorker` instance - moduleId: 'vs/language/css/src/worker', + moduleId: 'vs/language/css/worker', // passed in to the create() method createData: { - languageSettings: this._defaults.diagnosticsOptions + languageSettings: this._defaults.diagnosticsOptions, + languageId: this._defaults.languageId } });