[php] add webpack support #57680

This commit is contained in:
Martin Aeschlimann 2018-09-19 16:49:01 +02:00
parent f8a736c017
commit d216f0e06e
5 changed files with 26 additions and 271 deletions

View file

@ -1,3 +1,6 @@
.vscode/**
src/**
out/**
tsconfig.json
out/test/**
extension.webpack.config.js
yarn.lock

View file

@ -0,0 +1,20 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
//@ts-check
'use strict';
const withDefaults = require('../shared.webpack.config');
module.exports = withDefaults({
context: __dirname,
entry: {
extension: './src/phpMain.ts',
},
output: {
filename: 'phpMain.js'
}
});

View file

@ -73,8 +73,8 @@
}
},
"scripts": {
"compile": "gulp compile-extension:php",
"watch": "gulp watch-extension:php"
"compile": "npx gulp compile-extension:php-language-features",
"watch": "npx gulp watch-extension:php-language-features"
},
"dependencies": {
"vscode-nls": "^4.0.0"

View file

@ -1,17 +0,0 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
/*
var testRunner = require('vscode/lib/testrunner');
// You can directly control Mocha options by uncommenting the following lines
// See https://github.com/mochajs/mocha/wiki/Using-mocha-programmatically#set-options for more info
testRunner.configure({
ui: 'tdd', // the TDD UI is being used in extension.test.ts (suite, test, etc.)
useColors: true // colored output from test results
});
module.exports = testRunner;
*/

View file

@ -1,251 +0,0 @@
import assert = require('assert');
import {CompletionItemProvider, CompletionItem, CompletionItemKind, CancellationToken, TextDocument, Range, Position, Uri, workspace, window} from 'vscode';
import PHPCompletionItemProvider from '../features/completionItemProvider';
import HoverProvider from '../features/hoverProvider';
import SignatureHelpProvider from '../features/signatureHelpProvider';
var phpCompletionProvider = new PHPCompletionItemProvider();
var testSuggestionsFor = function(value:string, stringBefore:string):Thenable<CompletionItem[]> {
return workspace.openTextDocument(Uri.parse("untitled:/foo/new.js")).then(document => {
return window.showTextDocument(document).then(textEditor => {
return textEditor.edit(editBuilder => {
var lastLineLength = document.lineAt(document.lineCount - 1).text.length;
editBuilder.replace(new vscode.Range(new vscode.Position(0, 0), new vscode.Position(textEditor.document.lineCount - 1, lastLineLength)), value);
}).then(() => {
var idx = stringBefore ? value.indexOf(stringBefore) + stringBefore.length : 0;
var position = new Position(0, idx);
return phpCompletionProvider.provideCompletionItems(document, position, null);
})
})
});
};
var assertSuggestion= function(completions:CompletionItem[], label:string, kind: CompletionItemKind) {
var entries = completions.filter(suggestion => {
return suggestion.label === label;
});
assert.equal(entries.length, 1);
assert.equal(entries[0].kind, kind);
};
suite("PHP", () => {
test("Intellisense", (testDone:(err?:any) => void) => {
Promise.all([
testSuggestionsFor('<?php ', 'php ').then(completions => {
assertSuggestion(completions, '__CLASS__', CompletionItemKind.Field);
assertSuggestion(completions, 'mysql_thread_id', CompletionItemKind.Function);
assertSuggestion(completions, '$argc', CompletionItemKind.Variable);
}),
testSuggestionsFor('<?php mysql_', 'mysql_').then(completions => {
assertSuggestion(completions, 'mysql_db_name', CompletionItemKind.Function);
assertSuggestion(completions, 'mysql_list_tables', CompletionItemKind.Function);
})
]).then(() => testDone(), (errors:any[]) => {
testDone(errors.reduce((e1, e2) => e1 || e2));
});
});
});
// /*---------------------------------------------------------
// * Copyright (C) Microsoft Corporation. All rights reserved.
// *--------------------------------------------------------*/
// 'use strict';
// import assert = require('assert');
// import {CompletionItemProvider, CompletionItem, CompletionItemKind, CancellationToken, TextDocument, Range, Position} from 'vscode';
// var mockPHPWorkerEnv = function (url:Network.URL, content: string) : { worker: phpWorker.PHPWorker; model: mm.MirrorModel } {
// var resourceService = new ResourceService.ResourceService();
// var model = mm.createMirrorModelFromString(null, 0, content, modesUtil.createMockMode('mock.mode.id', /(-?\d*\.\d\w*)|(\$[\w-]*)|([\w-]+)/g), url);
// resourceService.insert(url, model);
// let services = servicesUtil2.createMockEditorWorkerServices({
// resourceService: resourceService,
// });
// var worker = new phpWorker.PHPWorker(modesUtil.createMockMode('mock.mode.id'), [],
// services.resourceService, services.markerService);
// return { worker: worker, model: model };
// };
// var testComputeInfo = function(value:string, stringBefore:string):WinJS.TPromise<Modes.IComputeExtraInfoResult> {
// var url = new Network.URL('test://1');
// var env = mockPHPWorkerEnv(url, value);
// var idx = stringBefore ? value.indexOf(stringBefore) : value.length;
// var position = env.model.getPositionFromOffset(idx);
// return env.worker.computeInfo(url, position);
// };
// var testSuggestionsFor = function(value:string, stringBefore:string):WinJS.TPromise<Modes.ISuggestions> {
// var url = new Network.URL('test://1');
// var env = mockPHPWorkerEnv(url, value);
// var idx = stringBefore ? value.indexOf(stringBefore) + stringBefore.length : 0;
// var position = env.model.getPositionFromOffset(idx);
// return env.worker.suggest(url, position).then(result => result[0]);
// };
// var testParameterHintsFor = function(value:string, stringBefore:string):WinJS.TPromise<Modes.IParameterHints> {
// var url = new Network.URL('test://1');
// var env = mockPHPWorkerEnv(url, value);
// var idx = stringBefore ? value.indexOf(stringBefore) + stringBefore.length : value.length;
// var position = env.model.getPositionFromOffset(idx);
// return env.worker.getParameterHints(url, position);
// };
// var assertSuggestion= function(completion:Modes.ISuggestions, label:string, type: string) {
// var entries = completion.suggestions.filter(function(suggestion: Modes.ISuggestion) {
// return suggestion.label === label;
// });
// assert.equal(entries.length, 1);
// assert.equal(entries[0].type, type);
// };
// var assertParameterHints= function(hints:Modes.IParameterHints, paramNames: string[], currentParameter: number) {
// assert.equal(hints.signatures.length, 1);
// assert.equal(hints.signatures[0].parameters.length, paramNames.length);
// var i= 0;
// var label = hints.signatures[0].label;
// hints.signatures[0].parameters.forEach(function(param) {
// assert.equal(param.label, paramNames[i++]);
// assert.equal(param.label, label.substring(param.signatureLabelOffset, param.signatureLabelEnd));
// });
// assert.equal(hints.currentParameter, currentParameter);
// };
// suite('PHP - Intellisense', () => {
// test('Globals', function(testDone):any {
// Promise.join([
// testSuggestionsFor('<?php ', 'php ').then(function(completion:Modes.ISuggestions):void {
// assert.equal(completion.currentWord, '');
// assertSuggestion(completion, '__CLASS__', 'field');
// assertSuggestion(completion, 'mysql_thread_id', 'function');
// assertSuggestion(completion, '$argc', 'variable');
// }),
// testSuggestionsFor('<?php mysql_', 'mysql_').then(function(completion:Modes.ISuggestions):void {
// assert.equal(completion.currentWord, 'mysql_');
// assertSuggestion(completion, 'mysql_db_name', 'function');
// assertSuggestion(completion, 'mysql_list_tables', 'function');
// })
// ]).done(() => testDone(), (errors:any[]) => {
// testDone(errors.reduce((e1, e2) => e1 || e2));
// });
// });
// test('Variables', function(testDone):any {
// WinJS.Promise.join([
// testSuggestionsFor('<?php $a = 1; $', '$a = 1; $').then(function(completion:Modes.ISuggestions):void {
// assert.equal(completion.currentWord, '$');
// assertSuggestion(completion, '$a', 'variable');
// })
// ]).done(() => testDone(), (errors:any[]) => {
// testDone(errors.reduce((e1, e2) => e1 || e2));
// });
// });
// });
// suite('PHP - Parameter hints', () => {
// test('Globals', function(testDone): any {
// WinJS.Promise.join([
// testParameterHintsFor('<?php mysql_data_seek(', null).then(function(hints: Modes.IParameterHints): void {
// assertParameterHints(hints, ['$result', '$row_number'], 0);
// }),
// testParameterHintsFor('<?php password_hash(', null).then(function(hints: Modes.IParameterHints): void {
// assertParameterHints(hints, ['$password', '$algo', '$options'], 0);
// }),
// testParameterHintsFor('<?php localtime(', null).then(function(hints: Modes.IParameterHints): void {
// assertParameterHints(hints, ['$timestamp', '$is_associative'], 0);
// }),
// testParameterHintsFor('<?php is_callable(', null).then(function(hints: Modes.IParameterHints): void {
// assertParameterHints(hints, ['$name', '$syntax_only', '&$callable_name'], 0);
// }),
// testParameterHintsFor('<?php array_unshift(', null).then(function(hints: Modes.IParameterHints): void {
// assertParameterHints(hints, ['&$array', '$var', '$...'], 0);
// })
// ]).done(() => testDone(), (errors:any[]) => {
// testDone(errors.reduce((e1, e2) => e1 || e2));
// });
// });
// test('With arguments', function(testDone): any {
// WinJS.Promise.join([
// testParameterHintsFor('<?php array_unshift(foo', null).then(function(hints:Modes.IParameterHints):void {
// assertParameterHints(hints, ['&$array', '$var', '$...'], 0);
// }),
// testParameterHintsFor('<?php array_unshift(foo, ', null).then(function(hints:Modes.IParameterHints):void {
// assertParameterHints(hints, ['&$array', '$var', '$...'], 1);
// }),
// testParameterHintsFor('<?php array_unshift(foo, f[]', null).then(function(hints:Modes.IParameterHints):void {
// assertParameterHints(hints, ['&$array', '$var', '$...'], 1);
// }),
// testParameterHintsFor('<?php array_unshift(foo, [a, 2]', null).then(function(hints:Modes.IParameterHints):void {
// assertParameterHints(hints, ['&$array', '$var', '$...'], 1);
// }),
// testParameterHintsFor('<?php array_unshift(foo, [a, 2], x', null).then(function(hints:Modes.IParameterHints):void {
// assertParameterHints(hints, ['&$array', '$var', '$...'], 2);
// }),
// testParameterHintsFor('<?php array_unshift(foo, [a, 2], x, y', null).then(function(hints:Modes.IParameterHints):void {
// assertParameterHints(hints, ['&$array', '$var', '$...'], 2);
// }),
// testParameterHintsFor('<?php array_unshift(foo, f(a, 2), x, y', null).then(function(hints:Modes.IParameterHints):void {
// assertParameterHints(hints, ['&$array', '$var', '$...'], 2);
// }),
// testParameterHintsFor('<?php array_unshift(foo, "f(a, 2"', null).then(function(hints:Modes.IParameterHints):void {
// assertParameterHints(hints, ['&$array', '$var', '$...'], 1);
// }),
// testParameterHintsFor('<?php array_unshift(foo, \'f(a, 2\'', null).then(function(hints:Modes.IParameterHints):void {
// assertParameterHints(hints, ['&$array', '$var', '$...'], 1);
// })
// ]).done(() => testDone(), (errors:any[]) => {
// testDone(errors.reduce((e1, e2) => e1 || e2));
// });
// });
// test('all function', function(testDone):any {
// var testFunc = function(hints:Modes.IParameterHints):void {
// assert.ok(hints !== null);
// assert.equal(1, hints.signatures.length, name);
// var res= hints.signatures[0].parameters.map(function(param) { return param.label; } ).join(',');
// assert.ok(hints.signatures[0].parameters.length > 0, 'parameters for ' + hints.signatures[0].label + ': ' + res);
// };
// var promises : WinJS.Promise[] = []
// for (var name in phpGlobals.globalfunctions) {
// if (phpGlobals.globalfunctions.hasOwnProperty(name)) {
// var entry = phpGlobals.globalfunctions[name];
// if (entry.signature) {
// promises.push(testParameterHintsFor('<?php ' + name + '(', null).then(testFunc));
// }
// }
// }
// WinJS.Promise.join(promises).done(() => testDone(), (errors) => {
// testDone(errors[0]);
// });
// });
// });
// suite('PHP - compute info', () => {
// test('Globals', function(testDone):any {
// WinJS.Promise.join([
// testComputeInfo('<?php $file=fopen("welcome.txt","r"); ?>', 'fopen').then((hints:Modes.IComputeExtraInfoResult) => {
// assert.ok(!!(hints.value || hints.htmlContent));
// }),
// testComputeInfo('<?php $file=fopen("welcome.txt","r"); ?>', 'welcome').then((hints:Modes.IComputeExtraInfoResult) => {
// assert.ok(hints === null);
// })
// ]).done(() => testDone(), (errors:any[]) => {
// testDone(errors.reduce((e1, e2) => e1 || e2));
// });
// });
// });