Merge branch 'Microsoft/master' into update-css-intellisense

# Conflicts:
#	src/vs/languages/html/common/htmlTags.ts
This commit is contained in:
David Storey 2015-12-08 17:03:17 -08:00
parent db6f0f960e
commit 23db8835f5
504 changed files with 30211 additions and 27525 deletions

15
.editorconfig Normal file
View file

@ -0,0 +1,15 @@
# EditorConfig is awesome: http://EditorConfig.org
# top-most EditorConfig file
root = true
# Tab indentation
[*]
indent_style = tab
indent_size = 4
# The indent size used in the `package.json` file cannot be changed
# https://github.com/npm/npm/pull/3180#issuecomment-16336516
[{.travis.yml,npm-shrinkwrap.json,package.json}]
indent_style = space
indent_size = 2

1
.gitignore vendored
View file

@ -2,6 +2,7 @@
npm-debug.log
Thumbs.db
node_modules/
.build/
out/
out-build/
out-editor/

View file

@ -26,12 +26,16 @@ before_install:
- npm config set python `which python`
- npm install -g gulp
- if [ $TRAVIS_OS_NAME == "linux" ]; then
export CXX="g++-4.9" CC="gcc-4.9";
export CXX="g++-4.9" CC="gcc-4.9" DISPLAY=:99.0;
sh -e /etc/init.d/xvfb start;
sleep 3;
fi
install:
- ./scripts/npm.sh install
- gulp electron compile
script:
- gulp hygiene
- gulp electron
- gulp compile
- ./test/run.sh

View file

@ -9,6 +9,7 @@
"search.exclude": {
"**/node_modules/**": true,
"**/bower_components": true,
".build/**": true,
"out*/**": true,
"extensions/**/out/**": true
}

View file

@ -57,7 +57,7 @@
},
{
"name": "electron",
"version": "0.34.1",
"version": "0.34.5",
"license": "MIT",
"repositoryURL": "https://github.com/atom/electron",
"isProd": true

View file

@ -1,6 +1,6 @@
# Visual Studio Code - Open Source
[![Build Status](https://travis-ci.org/Microsoft/vscode.svg?branch=master)](https://travis-ci.org/Microsoft/vscode)
[![Build Status](https://travis-ci.org/Microsoft/vscode.svg?branch=master)](https://travis-ci.org/Microsoft/vscode) [![Build status](https://ci.appveyor.com/api/projects/status/vuhlhg80tj3e2a0l?svg=true)](https://ci.appveyor.com/project/VSCode/vscode)
[VS Code](http://code.visualstudio.com) is a new type of tool that combines the simplicity of a code editor with what developers need for their core edit-build-debug cycle. Code provides comprehensive editing and debugging support, an extensibility model, and lightweight integration with existing tools.

14
appveyor.yml Normal file
View file

@ -0,0 +1,14 @@
environment:
ATOM_SHELL_INTERNAL_RUN_AS_NODE: 1
install:
- ps: Install-Product node 4.1.1 x64
- npm install -g gulp mocha
build_script:
- .\scripts\npm.bat install --force
- gulp electron
- gulp compile
test_script:
- mocha

View file

@ -14,7 +14,7 @@ var util = require('./lib/util');
var common = require('./gulpfile.common');
var root = path.dirname(__dirname);
var commit = process.env['BUILD_SOURCEVERSION'] || require('./lib/git').getVersion(root);
var commit = util.getVersion(root);
// Build

152
build/gulpfile.hygiene.js Normal file
View file

@ -0,0 +1,152 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
var gulp = require('gulp');
var filter = require('gulp-filter');
var es = require('event-stream');
var path = require('path');
var all = [
'build/**/*',
'extensions/**/*',
'scripts/**/*',
'src/**/*',
'test/**/*'
];
var eolFilter = [
'**',
'!extensions/**/out/**',
'!**/node_modules/**',
'!**/fixtures/**',
'!**/*.{svg,exe,png,scpt,bat,cur,ttf,woff,eot}',
];
var indentationFilter = [
'**',
'!**/lib/**',
'!**/*.d.ts',
'!extensions/typescript/server/**',
'!test/assert.js',
'!**/package.json',
'!**/npm-shrinkwrap.json',
'!**/octicons/**',
'!**/vs/languages/sass/test/common/example.scss',
'!**/vs/languages/less/common/parser/less.grammar.txt',
'!**/vs/languages/css/common/buildscripts/css-schema.xml',
'!**/vs/languages/markdown/common/raw.marked.js',
'!**/vs/base/common/winjs.base.raw.js',
'!**/vs/base/node/terminateProcess.sh',
'!**/vs/base/node/terminateProcess.sh',
'!**/vs/text.js',
'!**/vs/nls.js',
'!**/vs/css.js',
'!**/vs/loader.js',
'!extensions/**/snippets/**',
'!extensions/**/syntaxes/**',
'!extensions/**/themes/**',
];
var copyrightFilterList = [
'**',
'!**/*.json',
'!**/*.html',
'!**/test/**',
'!**/*.md',
'!**/*.sh',
'!**/*.txt',
'!src/vs/editor/standalone-languages/swift.ts',
];
var copyrightHeader = [
'/*---------------------------------------------------------------------------------------------',
' * Copyright (c) Microsoft Corporation. All rights reserved.',
' * Licensed under the MIT License. See License.txt in the project root for license information.',
' *--------------------------------------------------------------------------------------------*/'
].join('\n');
var hygiene = exports.hygiene = function (some) {
var errorCount = 0;
var eol = es.through(function (file) {
if (/\r\n?/g.test(file.contents.toString('utf8'))) {
console.error(file.relative + ': Bad EOL found');
errorCount++;
}
this.emit('data', file);
});
var indentation = es.through(function (file) {
file.contents
.toString('utf8')
.split(/\r\n|\r|\n/)
.forEach(function(line, i) {
if (/^\s*$/.test(line)) {
// empty or whitespace lines are OK
} else if (/^[\t]*[^\s]/.test(line)) {
// good indent
} else if (/^[\t]* \*/.test(line)) {
// block comment using an extra space
} else {
console.error(file.relative + '(' + (i + 1) + ',1): Bad whitespace indentation');
errorCount++;
}
});
this.emit('data', file);
});
var copyrights = es.through(function (file) {
if (file.contents.toString('utf8').indexOf(copyrightHeader) !== 0) {
console.error(file.relative + ': Missing or bad copyright statement');
errorCount++;
}
this.emit('data', file);
});
return gulp.src(some || all, { base: '.' })
.pipe(filter(function (f) { return !f.stat.isDirectory(); }))
.pipe(filter(eolFilter))
.pipe(eol)
.pipe(filter(indentationFilter))
.pipe(indentation)
.pipe(filter(copyrightFilterList))
.pipe(copyrights)
.pipe(es.through(null, function () {
if (errorCount > 0) {
this.emit('error', 'Hygiene failed with ' + errorCount + ' errors. Check \'build/gulpfile.hygiene.js\'.');
} else {
this.emit('end');
}
}));
};
gulp.task('hygiene', function () {
return hygiene();
});
// this allows us to run this as a git pre-commit hook
if (require.main === module) {
var cp = require('child_process');
cp.exec('git diff --cached --name-only', function (err, out) {
if (err) {
console.error();
console.error(err);
process.exit(1);
}
var some = out
.split(/\r?\n/)
.filter(function (l) { return !!l; });
hygiene(some).on('error', function (err) {
console.error();
console.error(err);
process.exit(1);
});
});
}

View file

@ -25,7 +25,8 @@ var util = require('./lib/util');
var buildfile = require('../src/buildfile');
var common = require('./gulpfile.common');
var root = path.dirname(__dirname);
var commit = process.env['BUILD_SOURCEVERSION'] || require('./lib/git').getVersion(root);
var build = path.join(root, '.build');
var commit = util.getVersion(root);
var baseModules = [
'app', 'applicationinsights', 'assert', 'auto-updater', 'browser-window',
@ -34,11 +35,15 @@ var baseModules = [
'https', 'https-proxy-agent', 'iconv-lite', 'ipc', 'menu', 'menu-item', 'net',
'original-fs', 'os', 'path', 'readline', 'remote', 'sax', 'screen', 'semver',
'shell', 'stream', 'string_decoder', 'url', 'vscode-textmate', 'web-frame', 'winreg',
'yauzl'
'yauzl', 'native-keymap'
];
// Build
var builtInExtensions = {
'jrieken.vscode-omnisharp': '0.1.0',
};
var vscodeEntryPoints = _.flatten([
buildfile.entrypoint('vs/workbench/workbench.main'),
buildfile.base,
@ -112,7 +117,7 @@ var config = {
gulp.task('electron', function () {
// Force windows to use ia32
var arch = (process.platform === 'win32' ? 'ia32' : process.arch);
return electron.dest(path.join(path.dirname(root), 'Electron-Build'), _.extend({}, config, { arch: arch }));
return electron.dest(path.join(build, 'electron'), _.extend({}, config, { arch: arch }));
});
function mixinProduct() {
@ -161,12 +166,7 @@ function packageTask(platform, arch, opts) {
'extensions/**',
'!extensions/*/src/**',
'!extensions/*/out/**/test/**',
'!extensions/typescript/bin/**',
'!extensions/csharp-o/node_modules/del/**',
'!extensions/csharp-o/node_modules/gulp/**',
'!extensions/csharp-o/node_modules/gulp-decompress/**',
'!extensions/csharp-o/node_modules/gulp-download/**',
'!extensions/csharp-o/node_modules/typescript/**'
'!extensions/typescript/bin/**'
], { base: '.' });
var pluginHostSourceMap = gulp.src(out + '/vs/workbench/node/pluginHostProcess.js.map', { base: '.' })
@ -182,8 +182,9 @@ function packageTask(platform, arch, opts) {
var license = gulp.src(['Credits_*', 'LICENSE.txt', 'ThirdPartyNotices.txt'], { base: '.' });
var api = gulp.src('src/vs/vscode.d.ts').pipe(rename('out/vs/vscode.d.ts'));
var depsSrc = _.flatten(Object.keys(packagejson.dependencies)
.map(function (d) { return ['node_modules/' + d + '/**', '!node_modules/' + d + '/**/{test,tests}/**']; }));
var depsSrc = _.flatten(Object.keys(packagejson.dependencies).concat(Object.keys(packagejson.optionalDependencies))
.map(function (d) { return ['node_modules/' + d + '/**', '!node_modules/' + d + '/**/{test,tests}/**']; })
);
var deps = gulp.src(depsSrc, { base: '.', dot: true })
.pipe(util.cleanNodeModule('fsevents', ['binding.gyp', 'fsevents.cc', 'build/**', 'src/**', 'test/**'], true))
@ -197,6 +198,11 @@ function packageTask(platform, arch, opts) {
resources = es.merge(resources, gulp.src(product.icons.application.png, { base: '.' }));
}
var extraExtensions = util.downloadExtensions(builtInExtensions)
.pipe(rename(function (p) {
p.dirname = path.posix.join('extensions', p.dirname);
}));
var all = es.merge(
api,
packageJson,
@ -204,6 +210,7 @@ function packageTask(platform, arch, opts) {
license,
sources,
deps,
extraExtensions,
resources
).pipe(util.skipDirectories());

View file

@ -1,36 +0,0 @@
var es = require('event-stream');
var fs = require('fs');
var path = require('path');
var copyright = [
'/*---------------------------------------------------------------------------------------------',
' * Copyright (c) Microsoft Corporation. All rights reserved.',
' * Licensed under the MIT License. See License.txt in the project root for license information.',
' *--------------------------------------------------------------------------------------------*/'
].join('\n');
exports.copyrights = function () {
return es.mapSync(function (file) {
if (file.contents) {
var contents = file.contents.toString('utf8');
if (contents.indexOf(copyright) !== 0) {
throw new Error('File ' + file.path + ' does not contain copyright statement.');
}
}
});
};
exports.insertCopyrights = function() {
return es.mapSync(function (file) {
if (file.contents) {
var contents = file.contents.toString('utf8');
if (contents.indexOf(copyright) !== 0) {
contents = copyright + '\n\n' + contents;
fs.writeFileSync(file.path, contents, 'utf8');
}
}
});
}

View file

@ -1,60 +0,0 @@
var es = require('event-stream');
var path = require('path');
module.exports = function (opts) {
return es.mapSync(function (file) {
if (file.stat.isDirectory()) {
return file;
}
var contents = file.contents.toString('utf8');
if (opts.complain) {
if (contents.indexOf('\r\n') >= 0) {
console.log(file.path + ' uses \\r\\n');
}
if (opts.whitespace) {
var lines = contents.split(/\r\n|\r|\n/);
for (var i = 0, len = lines.length; i < len; i++) {
var line = lines[i];
if (line.length === 0) {
// empty lines are OK
continue;
}
if (/^[\t]*[^\s]/.test(line)) {
// good indent
continue;
} else if (/^[\t]* \*/.test(line)) {
// block comment using an extra space
continue;
} else if (/^[\t]+$/.test(line)) {
// empty line
continue;
} else {
console.log(file.path + '(' + (i + 1) + ',1): Mixed whitespace indentation');
}
}
}
} else {
var lines = contents.split(/\r\n|\r|\n/);
if (opts.whitespace) {
for (var i = 0, len = lines.length; i < len; i++) {
var line = lines[i];
line = line.replace(/^\ {28}/, '\t\t\t\t\t\t\t');
line = line.replace(/^\ {24}/, '\t\t\t\t\t\t');
line = line.replace(/^\ {20}/, '\t\t\t\t\t');
line = line.replace(/^\ {16}/, '\t\t\t\t');
line = line.replace(/^\ {12}/, '\t\t\t');
line = line.replace(/^\ {8}/, '\t\t');
line = line.replace(/^\ {4}/, '\t');
lines[i] = line;
}
}
file.contents = new Buffer(lines.join('\n'), 'utf8');
}
return file;
});
};

View file

@ -10,6 +10,7 @@ var _ = require('underscore');
var path = require('path');
var fs = require('fs');
var rimraf = require('rimraf');
var git = require('./git');
var NoCancellationToken = {
isCancellationRequested: function () {
@ -276,3 +277,13 @@ exports.downloadExtensions = function(extensions) {
return es.merge(streams);
};
exports.getVersion = function (root) {
var version = process.env['BUILD_SOURCEVERSION'];
if (!version || !/^[0-9a-f]{40}$/i.test(version)) {
version = git.getVersion(root);
}
return version;
};

13
build/npm/preinstall.js Normal file
View file

@ -0,0 +1,13 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
var win = "Please run '.\\scripts\\npm.bat install' instead."
var nix = "Please run './scripts/npm.sh install' instead."
if (process.env['npm_config_disturl'] !== 'https://atom.io/download/atom-shell') {
console.error("You can't use plain npm to install Code's dependencies.");
console.error(/^win/.test(process.platform) ? win : nix);
process.exit(1);
}

View file

@ -1 +0,0 @@
bin

View file

@ -1,29 +0,0 @@
[
{
"name": "Omnisharp-roslyn",
"repositoryURL": "https://github.com/OmniSharp/omnisharp-roslyn",
"version": "1.5.5",
"license": "MIT",
"isProd": true
},
{
"name": "ScriptCS",
"repositoryURL": "https://github.com/scriptcs/scriptcs",
"version": "0.16.0",
"license": "Apache2",
"licenseDetail": [
"Copyright 2013 Glenn Block, Justin Rusbatch, Filip Wojcieszyn",
"",
"Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file ",
"except in compliance with the License. You may obtain a copy of the License at",
"",
"http://www.apache.org/licenses/LICENSE-2.0",
"",
"Unless required by applicable law or agreed to in writing, software distributed under the ",
"License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, ",
"either express or implied. See the License for the specific language governing permissions ",
"and limitations under the License."
],
"isProd": true
}
]

View file

@ -1,93 +0,0 @@
var gulp = require('gulp');
var decompress = require('gulp-decompress');
var es = require('event-stream');
var GitHub = require('github-releases');
var tmp = require('tmp');
var vfs = require('vinyl-fs');
var del = require('del');
var fs = require('fs');
var path = require('path');
tmp.setGracefulCleanup();
function downloadOmnisharp(version) {
var result = es.through();
function onError(err) {
result.emit('error', err);
}
var repo = new GitHub({
repo: 'OmniSharp/omnisharp-roslyn',
token: process.env['GITHUB_TOKEN']
});
repo.getReleases({ tag_name: version }, function (err, releases) {
if (err) { return onError(err); }
if (!releases.length) { return onError(new Error('Release not found')); }
if (!releases[0].assets.length) { return onError(new Error('Assets not found')); }
repo.downloadAsset(releases[0].assets[0], function (err, istream) {
if (err) { return onError(err); }
tmp.file(function (err, tmpPath, fd, cleanupCallback) {
if (err) { return onError(err); }
var ostream = fs.createWriteStream(null, { fd: fd });
ostream.once('error', onError);
istream.once('error', onError);
ostream.once('finish', function () {
vfs.src(tmpPath).pipe(result);
});
istream.pipe(ostream);
});
});
});
return result;
}
gulp.task('omnisharp:clean', function () {
return del('bin');
});
gulp.task('omnisharp:fetch', ['omnisharp:clean'], function () {
return downloadOmnisharp('v1.5.6')
.pipe(decompress({strip: 1}))
.pipe(gulp.dest('bin'));
});
gulp.task('omnisharp:fixscripts', ['omnisharp:fetch'], function () {
var _fixes = Object.create(null);
_fixes['./bin/omnisharp.cmd'] = '@"%~dp0packages\\dnx-clr-win-x86.1.0.0-beta4\\bin\\dnx.exe" "%~dp0packages\\OmniSharp\\1.0.0\\root" run %*';
_fixes['./bin/omnisharp'] = '#!/bin/bash\n\
SOURCE="${BASH_SOURCE[0]}"\n\
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink\n\
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"\n\
SOURCE="$(readlink "$SOURCE")"\n\
[[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located\n\
done\n\
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"\n\
export SET DNX_APPBASE="$DIR/packages/OmniSharp/1.0.0/root"\n\
export PATH=/usr/local/bin:/Library/Frameworks/Mono.framework/Commands:$PATH # this is required for the users of the Homebrew Mono package\n\
exec "$DIR/packages/dnx-mono.1.0.0-beta4/bin/dnx" "$DNX_APPBASE" run "$@"\n\
\n';
var promises = Object.keys(_fixes).map(function (key) {
return new Promise(function(resolve, reject) {
fs.writeFile(path.join(__dirname, key), _fixes[key], function (err) {
if (err) {
reject(err);
} else {
resolve();
}
})
});
});
return Promise.all(promises)
});
gulp.task('omnisharp', ['omnisharp:fixscripts']);

View file

@ -1,102 +0,0 @@
{
"name": "csharp-o",
"version": "0.1.0",
"publisher": "vscode",
"engines": {
"node": "^4.0.0",
"vscode": "*"
},
"activationEvents": [
"onLanguage:csharp",
"onCommand:o.restart",
"onCommand:o.pickProjectAndStart",
"onCommand:o.restore",
"onCommand:o.execute",
"onCommand:o.showOutput",
"onCommand:o.execute",
"onCommand:o.execute-last-command"
],
"main": "./out/omnisharpMain",
"scripts": {
"postinstall": "node ./node_modules/gulp/bin/gulp.js omnisharp",
"vscode:prepublish": "node ../../node_modules/gulp/bin/gulp.js --gulpfile ../../gulpfile.plugins.js compile-plugin:csharp-o ./tsconfig.json"
},
"dependencies": {
"run-in-terminal": "*",
"semver": "*"
},
"devDependencies": {
"del": "^2.0.2",
"event-stream": "^3.3.2",
"github-releases": "^0.3.0",
"gulp": "^3.8.9",
"gulp-decompress": "^1.2.0",
"tmp": "0.0.28",
"vinyl-fs": "^2.2.1"
},
"extensionDependencies": [
"vscode.csharp"
],
"contributes": {
"commands": [
{
"command": "o.restart",
"title": "Restart OmniSharp",
"category": "OmniSharp"
},
{
"command": "o.pickProjectAndStart",
"title": "Select Project",
"category": "OmniSharp"
},
{
"command": "o.restore",
"title": "Restore Packages",
"category": "dnx"
},
{
"command": "o.execute",
"title": "Run Command",
"category": "dnx"
}
],
"keybindings": [
{
"command": "o.showOutput",
"key": "Ctrl+L L",
"mac": "Cmd+L L"
},
{
"command": "o.execute",
"key": "Ctrl+L Shift+R",
"mac": "Cmd+L Shift+R"
},
{
"command": "o.execute-last-command",
"key": "Ctrl+L R",
"mac": "Cmd+L R"
},
{
"key": "shift+0",
"command": "^acceptSelectedSuggestion",
"when": "editorTextFocus && suggestWidgetVisible && editorLangId == 'csharp' && suggestionSupportsAcceptOnKey"
},
{
"key": "shift+9",
"command": "^acceptSelectedSuggestion",
"when": "editorTextFocus && suggestWidgetVisible && editorLangId == 'csharp' && suggestionSupportsAcceptOnKey"
},
{
"key": ".",
"command": "^acceptSelectedSuggestion",
"when": "editorTextFocus && suggestWidgetVisible && editorLangId == 'csharp' && suggestionSupportsAcceptOnKey"
}
],
"snippets": [
{
"language": "csharp",
"path": "./snippets/csharp.json"
}
]
}
}

View file

@ -1,524 +0,0 @@
{
"Attribute using recommended pattern": {
"prefix": "attribute",
"body": [
"[System.AttributeUsage(System.AttributeTargets.${All}, Inherited = ${false}, AllowMultiple = ${true})]",
"sealed class ${My}Attribute : System.Attribute",
"{",
" // See the attribute guidelines at",
" // http://go.microsoft.com/fwlink/?LinkId=85236",
" readonly string positionalString;",
" ",
" // This is a positional argument",
" public ${My}Attribute (string positionalString)",
" {",
" this.positionalString = positionalString;",
" ",
" // TODO: Implement code here",
" ${throw new System.NotImplementedException();}",
" }",
" ",
" public string PositionalString",
" {",
" get { return positionalString; }",
" }",
" ",
" // This is a named argument",
" public int NamedInt { get; set; }",
"}"
],
"description": "Attribute using recommended pattern"
},
"Checked block": {
"prefix": "checked",
"body": [
"checked",
"{",
" $0",
"}"
],
"description": "Checked block"
},
"Class": {
"prefix": "class",
"body": [
"class ${Name}",
"{",
" $0",
"}"
],
"description": "Class"
},
"Console.WriteLine": {
"prefix": "cw",
"body": [
"System.Console.WriteLine($0);"
],
"description": "Console.WriteLine"
},
"do...while loop": {
"prefix": "do",
"body": [
"do",
"{",
" $0",
"} while (${true});"
],
"description": "do...while loop"
},
"Else statement": {
"prefix": "else",
"body": [
"else",
"{",
" $0",
"}"
],
"description": "Else statement"
},
"Enum": {
"prefix": "enum",
"body": [
"enum ${Name}",
"{",
" $0",
"}"
],
"description": "Enum"
},
"Implementing Equals() according to guidelines": {
"prefix": "equals",
"body": [
"// override object.Equals",
"public override bool Equals (object obj)",
"{",
" //",
" // See the full list of guidelines at",
" // http://go.microsoft.com/fwlink/?LinkID=85237",
" // and also the guidance for operator== at",
" // http://go.microsoft.com/fwlink/?LinkId=85238",
" //",
" ",
" if (obj == null || GetType() != obj.GetType())",
" {",
" return false;",
" }",
" ",
" // TODO: write your implementation of Equals() here",
" ${1:throw new System.NotImplementedException();}",
" return base.Equals (obj);",
"}",
"",
"// override object.GetHashCode",
"public override int GetHashCode()",
"{",
" // TODO: write your implementation of GetHashCode() here",
" ${2:throw new System.NotImplementedException();}",
" return base.GetHashCode();",
"}"
],
"description": "Implementing Equals() according to guidelines"
},
"Exception": {
"prefix": "exception",
"body": [
"[System.Serializable]",
"public class ${My}Exception : ${System.Exception}",
"{",
" public ${My}Exception() { }",
" public ${My}Exception( string message ) : base( message ) { }",
" public ${My}Exception( string message, System.Exception inner ) : base( message, inner ) { }",
" protected ${My}Exception(",
" System.Runtime.Serialization.SerializationInfo info,",
" System.Runtime.Serialization.StreamingContext context ) : base( info, context ) { }",
"}"
],
"description": "Exception"
},
"Foreach statement": {
"prefix": "foreach",
"body": [
"foreach (${var} ${item} in ${collection})",
"{",
" $0",
"}"
],
"description": "Foreach statement"
},
"Reverse for loop": {
"prefix": "forr",
"body": [
"for (int ${i} = ${length} - 1; ${i} >= 0 ; ${i}--)",
"{",
" $0",
"}"
],
"description": "Reverse for loop"
},
"for loop": {
"prefix": "for",
"body": [
"for (int ${i} = 0; ${i} < ${length}; ${i}++)",
"{",
" $0",
"}"
],
"description": "for loop"
},
"if statement": {
"prefix": "if",
"body": [
"if (${true})",
"{",
" $0",
"}"
],
"description": "if statement"
},
"Indexer": {
"prefix": "indexer",
"body": [
"${public} ${object} this[${int} index]",
"{",
" get { $0 }",
" set { $1 }",
"}"
],
"description": "Indexer"
},
"Interface": {
"prefix": "interface",
"body": [
"interface I${Name}",
"{",
" $0",
"}"
],
"description": "Interface"
},
"Safely invoking an event": {
"prefix": "invoke",
"body": [
"${EventHandler} temp = ${MyEvent};",
"if (temp != null)",
"{",
" temp($0);",
"}"
],
"description": "Safely invoking an event"
},
"Simple iterator": {
"prefix": "iterator",
"body": [
"public System.Collections.Generic.IEnumerator<${ElementType}> GetEnumerator()",
"{",
" $0throw new System.NotImplementedException();",
" yield return default(${ElementType});",
"}"
],
"description": "Simple iterator"
},
"Named iterator/indexer pair using a nested class": {
"prefix": "iterindex",
"body": [
"public ${Name}Iterator ${Name}",
"{",
" get",
" {",
" return new ${Name}Iterator(this);",
" }",
"}",
"",
"public class ${Name}Iterator",
"{",
" readonly ${ClassName} outer;",
" ",
" internal ${Name}Iterator(${ClassName} outer)",
" {",
" this.outer = outer;",
" }",
" ",
" // TODO: provide an appropriate implementation here",
" public int Length { get { return 1; } }",
" ",
" public ${ElementType} this[int index]",
" {",
" get",
" {",
" //",
" // TODO: implement indexer here",
" //",
" // you have full access to ${ClassName} privates",
" //",
" ${throw new System.NotImplementedException();}",
" return default(${ElementType});",
" }",
" }",
" ",
" public System.Collections.Generic.IEnumerator<${ElementType}> GetEnumerator()",
" {",
" for (int i = 0; i < this.Length; i++)",
" {",
" yield return this[i];",
" }",
" }",
"}"
],
"description": "Named iterator/indexer pair using a nested class"
},
"Lock statement": {
"prefix": "lock",
"body": [
"lock (${this})",
"{",
" $0",
"}"
],
"description": "Lock statement"
},
"MessageBox.Show": {
"prefix": "mbox",
"body": [
"System.Windows.Forms.MessageBox.Show(\"${Text}\");$0"
],
"description": "MessageBox.Show"
},
"Namespace": {
"prefix": "namespace",
"body": [
"namespace ${Name}",
"{",
" $0",
"}"
],
"description": "Namespace"
},
"#if": {
"prefix": "ifd",
"body": [
"#if ${true}",
" $0",
"#endif"
],
"description": "#if"
},
"#region": {
"prefix": "region",
"body": [
"#region ${Name}",
" $0",
"#endregion"
],
"description": "#region"
},
"Property and backing field": {
"prefix": "propfull",
"body": [
"private ${int} ${myVar};",
"public ${int} ${MyProperty}",
"{",
" get { return ${myVar};}",
" set { ${myVar} = value;}",
"}",
"$0"
],
"description": "Property and backing field"
},
"propg": {
"prefix": "propg",
"body": [
"public ${int} ${MyProperty} { get; private set; }$0"
],
"description": "An automatically implemented property with a 'get' accessor and a private 'set' accessor. C# 3.0 or higher"
},
"prop": {
"prefix": "prop",
"body": [
"public ${int} ${MyProperty} { get; set; }$0"
],
"description": "An automatically implemented property. C# 3.0 or higher"
},
"sim": {
"prefix": "sim",
"body": [
"static int Main(string[] args)",
"{",
" $0",
" return 0;",
"}"
],
"description": "int Main()"
},
"Struct": {
"prefix": "struct",
"body": [
"struct ${Name}",
"{",
" $0",
"}"
],
"description": "Struct"
},
"svm": {
"prefix": "svm",
"body": [
"static void Main(string[] args)",
"{",
" $0",
"}"
],
"description": "void Main()"
},
"Switch statement": {
"prefix": "switch",
"body": [
"switch (${switch_on})",
"{",
" $0",
" default:",
"}"
],
"description": "Switch statement"
},
"Try finally": {
"prefix": "tryf",
"body": [
"try",
"{",
" ${_}",
"}",
"finally",
"{",
" $0",
"}"
],
"description": "Try finally"
},
"Try catch": {
"prefix": "try",
"body": [
"try",
"{",
" ${_}",
"}",
"catch (${System.Exception})",
"{",
" $0",
" throw;",
"}"
],
"description": "Try catch"
},
"Unchecked block": {
"prefix": "unchecked",
"body": [
"unchecked",
"{",
" $0",
"}"
],
"description": "Unchecked block"
},
"Unsafe statement": {
"prefix": "unsafe",
"body": [
"unsafe",
"{",
" $0",
"}"
],
"description": "Unsafe statement"
},
"Using statement": {
"prefix": "using",
"body": [
"using(${resource})",
"{",
" $0",
"}"
],
"description": "Using statement"
},
"While loop": {
"prefix": "while",
"body": [
"while (${true})",
"{",
" $0",
"}"
],
"description": "While loop"
}
}

View file

@ -1,26 +0,0 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import {OmnisharpServer} from '../omnisharpServer';
import {Disposable} from 'vscode';
export default class AbstractProvider {
protected _server: OmnisharpServer;
protected _disposables: Disposable[];
constructor(server: OmnisharpServer) {
this._server = server;
this._disposables = [];
}
dispose() {
while (this._disposables.length) {
this._disposables.pop().dispose();
}
}
}

View file

@ -1,62 +0,0 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import {Disposable, Uri, workspace} from 'vscode';
import {OmnisharpServer} from '../omnisharpServer';
import * as proto from '../protocol';
function forwardDocumentChanges(server: OmnisharpServer): Disposable {
return workspace.onDidChangeTextDocument(event => {
let {document} = event;
if (document.isUntitled || document.languageId !== 'csharp') {
return;
}
if (!server.isRunning()) {
return;
}
server.makeRequest(proto.UpdateBuffer, <proto.Request>{
Buffer: document.getText(),
Filename: document.fileName
}).catch(err => {
console.error(err);
return err;
});
});
}
function forwardFileChanges(server: OmnisharpServer): Disposable {
function onFileSystemEvent(uri: Uri): void {
if (!server.isRunning()) {
return;
}
let req = { Filename: uri.fsPath };
server.makeRequest<boolean>(proto.FilesChanged, [req]).catch(err => {
console.warn('[o] failed to forward file change event for ' + uri.fsPath, err);
return err;
});
}
const watcher = workspace.createFileSystemWatcher('**/*.*');
let d1 = watcher.onDidCreate(onFileSystemEvent);
let d2 = watcher.onDidChange(onFileSystemEvent);
let d3 = watcher.onDidDelete(onFileSystemEvent);
return Disposable.from(watcher, d1, d2, d3);
}
export default function forwardChanges(server: OmnisharpServer): Disposable {
// combine file watching and text document watching
return Disposable.from(
forwardDocumentChanges(server),
forwardFileChanges(server));
}

View file

@ -1,98 +0,0 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import {CodeActionProvider, CodeActionContext, Command, CancellationToken, TextDocument, WorkspaceEdit, TextEdit, Range, Uri, workspace, commands} from 'vscode';
import {OmnisharpServer} from '../omnisharpServer';
import AbstractProvider from './abstractProvider';
import {TextChange, V2} from '../protocol';
import {toRange2} from '../typeConvertion';
export default class OmnisharpCodeActionProvider extends AbstractProvider implements CodeActionProvider {
private _disabled: boolean;
private _commandId: string;
constructor(server: OmnisharpServer) {
super(server);
this._commandId = 'omnisharp.runCodeAction';
this._updateEnablement();
let d1 = workspace.onDidChangeConfiguration(this._updateEnablement, this);
let d2 = commands.registerCommand(this._commandId, this._runCodeAction, this);
this._disposables.push(d1, d2);
}
private _updateEnablement(): void {
let value = workspace.getConfiguration().get('csharp.disableCodeActions', false);
this._disabled = value;
}
public provideCodeActions(document: TextDocument, range: Range, context: CodeActionContext, token: CancellationToken): Promise<Command[]> {
if (this._disabled) {
return;
}
let req: V2.GetCodeActionsRequest = {
Filename: document.fileName,
Selection: OmnisharpCodeActionProvider._asRange(range)
}
return this._server.makeRequest<V2.GetCodeActionsResponse>(V2.GetCodeActions, req, token).then(response => {
return response.CodeActions.map(ca => {
return {
title: ca.Name,
command: this._commandId,
arguments: [ca.Identifier, document, range]
};
});
}, (error) => {
return Promise.reject('Problem invoking \'GetCodeActions\' on OmniSharp server: ' + error);
});
}
private _runCodeAction(id: string, document: TextDocument, range: Range): Promise<any> {
let req: V2.RunCodeActionRequest = {
Filename: document.fileName,
Selection: OmnisharpCodeActionProvider._asRange(range),
Identifier: id,
WantsTextChanges: true
};
return this._server.makeRequest<V2.RunCodeActionResponse>(V2.RunCodeAction, req).then(response => {
if (response && Array.isArray(response.Changes)) {
let edit = new WorkspaceEdit();
for (let change of response.Changes) {
let uri = Uri.file(change.FileName);
let edits: TextEdit[] = [];
for (let textChange of change.Changes) {
edits.push(TextEdit.replace(toRange2(textChange), textChange.NewText));
}
edit.set(uri, edits);
}
return workspace.applyEdit(edit);
}
}, (error) => {
return Promise.reject('Problem invoking \'RunCodeAction\' on OmniSharp server: ' + error);
});
}
private static _asRange(range: Range): V2.Range {
let {start, end} = range;
return {
Start: { Line: start.line + 1, Column: start.character + 1 },
End: { Line: end.line + 1, Column: end.character + 1 }
};
}
}

View file

@ -1,83 +0,0 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import {CancellationToken, CodeLens, SymbolKind, Range, Uri, TextDocument, CodeLensProvider, Position} from 'vscode';
import {createRequest, toRange, toLocation} from '../typeConvertion';
import AbstractSupport from './abstractProvider';
import * as proto from '../protocol';
class OmniSharpCodeLens extends CodeLens {
fileName: string;
constructor(fileName: string, range: Range) {
super(range);
this.fileName = fileName;
}
}
export default class OmniSharpCodeLensProvider extends AbstractSupport implements CodeLensProvider {
private static filteredSymbolNames: { [name: string]: boolean } = {
'Equals': true,
'Finalize': true,
'GetHashCode': true,
'ToString': true
};
provideCodeLenses(document: TextDocument, token: CancellationToken): CodeLens[] | Thenable<CodeLens[]> {
return this._server.makeRequest<proto.CurrentFileMembersAsTreeResponse>(proto.CurrentFileMembersAsTree, {
Filename: document.fileName
}, token).then(tree => {
var ret: CodeLens[] = [];
tree.TopLevelTypeDefinitions.forEach(node => OmniSharpCodeLensProvider._convertQuickFix(ret, document.fileName, node));
return ret;
});
}
private static _convertQuickFix(bucket: CodeLens[], fileName:string, node: proto.Node): void {
if (node.Kind === 'MethodDeclaration' && OmniSharpCodeLensProvider.filteredSymbolNames[node.Location.Text]) {
return;
}
let lens = new OmniSharpCodeLens(fileName, toRange(node.Location));
bucket.push(lens);
for (let child of node.ChildNodes) {
OmniSharpCodeLensProvider._convertQuickFix(bucket, fileName, child);
}
}
resolveCodeLens(codeLens: CodeLens, token: CancellationToken): Thenable<CodeLens> {
if (codeLens instanceof OmniSharpCodeLens) {
let req = <proto.FindUsagesRequest>{
Filename: codeLens.fileName,
Line: codeLens.range.start.line + 1,
Column: codeLens.range.start.character + 1,
OnlyThisFile: false,
ExcludeDefinition: true
};
return this._server.makeRequest<proto.QuickFixResponse>(proto.FindUsages, req, token).then(res => {
if (!res || !Array.isArray(res.QuickFixes)) {
return;
}
let len = res.QuickFixes.length;
codeLens.command = {
title: len === 1 ? '1 reference' : `${len} references`,
command: 'editor.action.showReferences',
arguments: [Uri.file(req.Filename), codeLens.range.start, res.QuickFixes.map(toLocation)]
};
return codeLens;
});
}
}
}

View file

@ -1,171 +0,0 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import * as proto from '../protocol';
import {OmnisharpServer} from '../omnisharpServer';
import {Disposable, ViewColumn, commands, window} from 'vscode';
import {join, dirname, basename} from 'path';
import findLaunchTargets from '../launchTargetFinder';
import {runInTerminal} from 'run-in-terminal';
const isWin = /^win/.test(process.platform);
export default function registerCommands(server: OmnisharpServer) {
let d1 = commands.registerCommand('o.restart', () => server.restart());
let d2 = commands.registerCommand('o.pickProjectAndStart', () => pickProjectAndStart(server));
let d3 = commands.registerCommand('o.restore', () => dnxRestoreForAll(server));
let d4 = commands.registerCommand('o.execute', () => dnxExecuteCommand(server));
let d5 = commands.registerCommand('o.execute-last-command', () => dnxExecuteLastCommand(server));
let d6 = commands.registerCommand('o.showOutput', () => server.getChannel().show(ViewColumn.Three));
return Disposable.from(d1, d2, d3, d4, d5, d6);
}
function pickProjectAndStart(server: OmnisharpServer) {
return findLaunchTargets().then(targets => {
let currentPath = server.getSolutionPathOrFolder();
if (currentPath) {
for (let target of targets) {
if (target.target.fsPath === currentPath) {
target.label = `\u2713 ${target.label}`;
}
}
}
return window.showQuickPick(targets, {
matchOnDescription: true,
placeHolder: `Select 1 of ${targets.length} projects`
}).then(target => {
if (target) {
return server.restart(target.target.fsPath);
}
});
});
}
interface Command {
label: string;
description: string;
execute(): Thenable<any>;
}
let lastCommand: Command;
function dnxExecuteLastCommand(server: OmnisharpServer) {
if (lastCommand) {
lastCommand.execute();
} else {
dnxExecuteCommand(server);
}
}
function dnxExecuteCommand(server: OmnisharpServer) {
if (!server.isRunning()) {
return Promise.reject('OmniSharp server is not running.');
}
return server.makeRequest<proto.WorkspaceInformationResponse>(proto.Projects).then(info => {
let commands: Command[] = [];
info.Dnx.Projects.forEach(project => {
Object.keys(project.Commands).forEach(key => {
commands.push({
label: `dnx ${key} - (${project.Name || basename(project.Path)})`,
description: dirname(project.Path),
execute() {
lastCommand = this;
let command = join(info.Dnx.RuntimePath, 'bin/dnx');
let args = [key];
// dnx-beta[1-6] needs a leading dot, like 'dnx . run'
if (/-beta[1-6]/.test(info.Dnx.RuntimePath)) {
args.unshift('.');
}
if (isWin) {
command += '.exe';
}
return runInTerminal(command, args, {
cwd: dirname(project.Path),
env: {
// KRE_COMPILATION_SERVER_PORT: workspace.DesignTimeHostPort
}
});
}
});
});
});
return window.showQuickPick(commands).then(command => {
if (command) {
return command.execute();
}
});
});
}
export function dnxRestoreForAll(server: OmnisharpServer) {
if (!server.isRunning()) {
return Promise.reject('OmniSharp server is not running.');
}
return server.makeRequest<proto.WorkspaceInformationResponse>(proto.Projects).then(info => {
let commands:Command[] = [];
info.Dnx.Projects.forEach(project => {
commands.push({
label: `dnu restore - (${project.Name || basename(project.Path)})`,
description: dirname(project.Path),
execute() {
let command = join(info.Dnx.RuntimePath, 'bin/dnu');
if (isWin) {
command += '.cmd';
}
return runInTerminal(command, ['restore'], {
cwd: dirname(project.Path)
});
}
});
});
return window.showQuickPick(commands).then(command => {
if(command) {
return command.execute();
}
});
});
}
export function dnxRestoreForProject(server: OmnisharpServer, fileName: string) {
return server.makeRequest<proto.WorkspaceInformationResponse>(proto.Projects).then((info):Promise<any> => {
for(let project of info.Dnx.Projects) {
if (project.Path === fileName) {
let command = join(info.Dnx.RuntimePath, 'bin/dnu');
if (isWin) {
command += '.cmd';
}
return runInTerminal(command, ['restore'], {
cwd: dirname(project.Path)
});
}
}
return Promise.reject(`Failed to execute restore, try to run 'dnu restore' manually for ${fileName}.`)
});
}

View file

@ -1,86 +0,0 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import {plain} from './documentation';
import AbstractSupport from './abstractProvider';
import * as proto from '../protocol';
import {createRequest} from '../typeConvertion';
import {CompletionItemProvider, CompletionItem, CompletionItemKind, Uri, CancellationToken, TextDocument, Range, Position} from 'vscode';
export default class OmniSharpCompletionItemProvider extends AbstractSupport implements CompletionItemProvider {
public provideCompletionItems(document: TextDocument, position: Position, token: CancellationToken): Promise<CompletionItem[]> {
let wordToComplete = '';
let range = document.getWordRangeAtPosition(position);
if (range) {
wordToComplete = document.getText(new Range(range.start, position));
}
let req = createRequest<proto.AutoCompleteRequest>(document, position);
req.WordToComplete = wordToComplete;
req.WantDocumentationForEveryCompletionResult = true;
req.WantKind = true;
return this._server.makeRequest<proto.AutoCompleteResponse[]>(proto.AutoComplete, req).then(values => {
if (!values) {
return;
}
let result: CompletionItem[] = [];
let completions: { [c: string]: CompletionItem[] } = Object.create(null);
// transform AutoCompleteResponse to CompletionItem and
// group by code snippet
for (let value of values) {
let completion = new CompletionItem(value.CompletionText.replace(/\(|\)|<|>/g, ''));
completion.detail = value.DisplayText;
completion.documentation = plain(value.Description);
completion.kind = _kinds[value.Kind] || CompletionItemKind.Property;
let array = completions[completion.label];
if (!array) {
completions[completion.label] = [completion];
} else {
array.push(completion);
}
}
// per suggestion group, select on and indicate overloads
for (let key in completions) {
let suggestion = completions[key][0],
overloadCount = completions[key].length - 1;
if (overloadCount === 0) {
// remove non overloaded items
delete completions[key];
} else {
// indicate that there is more
suggestion.detail = `${suggestion.detail} (+ ${overloadCount} overload(s))`;
}
result.push(suggestion);
}
return result;
});
}
}
var _kinds: { [kind: string]: CompletionItemKind; } = Object.create(null);
_kinds['Variable'] = CompletionItemKind.Variable;
_kinds['Struct'] = CompletionItemKind.Interface;
_kinds['Interface'] = CompletionItemKind.Interface;
_kinds['Enum'] = CompletionItemKind.Enum;
_kinds['EnumMember'] = CompletionItemKind.Property;
_kinds['Property'] = CompletionItemKind.Property;
_kinds['Class'] = CompletionItemKind.Class;
_kinds['Field'] = CompletionItemKind.Field;
_kinds['EventField'] = CompletionItemKind.File;
_kinds['Method'] = CompletionItemKind.Method;

View file

@ -1,25 +0,0 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import AbstractSupport from './abstractProvider';
import * as Protocol from '../protocol';
import {createRequest, toLocation} from '../typeConvertion';
import {Uri, TextDocument, Position, Location, CancellationToken, DefinitionProvider} from 'vscode';
export default class CSharpDefinitionProvider extends AbstractSupport implements DefinitionProvider {
public provideDefinition(document: TextDocument, position: Position, token: CancellationToken): Promise<Location> {
let req = createRequest(document, position);
return this._server.makeRequest<Protocol.ResourceLocation>(Protocol.GoToDefinition, req, token).then(value => {
if (value && value.FileName) {
return toLocation(value);
}
});
}
}

View file

@ -1,232 +0,0 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import {OmnisharpServer} from '../omnisharpServer';
import AbstractSupport from './abstractProvider';
import * as proto from '../protocol';
import {createRequest, toRange} from '../typeConvertion';
import {Disposable, Uri, CancellationTokenSource, TextDocument, TextDocumentChangeEvent, Range, Diagnostic, DiagnosticSeverity, Location, workspace, languages} from 'vscode';
export class Advisor {
private _disposable: Disposable;
private _server: OmnisharpServer;
private _packageRestoreCounter: number = 0;
private _projectSourceFileCounts: { [path: string]: number } = Object.create(null);
constructor(server: OmnisharpServer) {
this._server = server;
let d1 = server.onProjectChange(this._onProjectChange, this);
let d2 = server.onBeforePackageRestore(this._onBeforePackageRestore, this);
let d3 = server.onPackageRestore(this._onPackageRestore, this);
this._disposable = Disposable.from(d1, d2, d3);
}
public dispose() {
this._disposable.dispose();
}
public shouldValidateFiles(): boolean {
return this._isServerStarted()
&& !this._isRestoringPackages();
}
public shouldValidateProject(): boolean {
return this._isServerStarted()
&& !this._isRestoringPackages()
&& !this._isHugeProject();
}
private _onProjectChange(info: proto.ProjectInformationResponse): void {
if (info.DnxProject && info.DnxProject.SourceFiles) {
this._projectSourceFileCounts[info.DnxProject.Path] = info.DnxProject.SourceFiles.length;
}
if (info.MsBuildProject && info.MsBuildProject.SourceFiles) {
this._projectSourceFileCounts[info.MsBuildProject.Path] = info.MsBuildProject.SourceFiles.length;
}
}
private _onBeforePackageRestore(): void {
this._packageRestoreCounter += 1;
}
private _onPackageRestore(): void {
this._packageRestoreCounter -= 1;
}
private _isServerStarted(): boolean {
return this._server.isRunning();
}
private _isRestoringPackages(): boolean {
return this._packageRestoreCounter > 0;
}
private _isHugeProject(): boolean {
var sourceFileCount = 0;
for (var key in this._projectSourceFileCounts) {
sourceFileCount += this._projectSourceFileCounts[key];
if (sourceFileCount > 1000) {
return true;
}
}
return false;
}
}
export default function reportDiagnostics(server: OmnisharpServer, advisor: Advisor): Disposable {
return new DiagnosticsProvider(server, advisor);
}
class DiagnosticsProvider extends AbstractSupport {
private _validationAdvisor: Advisor;
private _disposable: Disposable;
private _documentValidations: { [uri: string]: CancellationTokenSource } = Object.create(null);
private _projectValidation: CancellationTokenSource;
private _diagnostics: vscode.DiagnosticCollection;
constructor(server: OmnisharpServer, validationAdvisor: Advisor) {
super(server);
this._validationAdvisor = validationAdvisor;
this._diagnostics = languages.createDiagnosticCollection('omnisharp');
let d1 = this._server.onPackageRestore(this._validateProject, this);
let d2 = this._server.onProjectChange(this._validateProject, this);
let d4 = workspace.onDidOpenTextDocument(event => this._onDocumentAddOrChange(event), this);
let d3 = workspace.onDidChangeTextDocument(event => this._onDocumentAddOrChange(event.document), this);
let d5 = workspace.onDidCloseTextDocument(this._onDocumentRemove, this);
this._disposable = Disposable.from(this._diagnostics, d1, d2, d3, d4, d5);
}
public dispose(): void {
if (this._projectValidation) {
this._projectValidation.dispose();
}
for (let key in this._documentValidations) {
this._documentValidations[key].dispose();
}
this._disposable.dispose();
}
private _onDocumentAddOrChange(document: TextDocument): void {
if (document.languageId === 'csharp' && document.uri.scheme === 'file') {
this._validateDocument(document);
this._validateProject();
}
}
private _onDocumentRemove(document: TextDocument) {
let key = document.uri.toString();
let didChange = false;
if (this._diagnostics[key]) {
didChange = true;
this._diagnostics[key].dispose();
delete this._diagnostics[key];
}
if (this._documentValidations[key]) {
didChange = true;
this._documentValidations[key].cancel();
delete this._documentValidations[key];
}
if (didChange) {
this._validateProject();
}
}
private _validateDocument(document: TextDocument): void {
if (!this._validationAdvisor.shouldValidateFiles()) {
return;
}
let key = document.uri.toString();
if (this._documentValidations[key]) {
this._documentValidations[key].cancel();
}
let source = new CancellationTokenSource();
let handle = setTimeout(() => {
let req: proto.Request = { Filename: document.fileName };
this._server.makeRequest<proto.QuickFixResponse>(proto.CodeCheck, req, source.token).then(value => {
// (re)set new diagnostics for this document
let diagnostics = value.QuickFixes.map(DiagnosticsProvider._asDiagnostic);
this._diagnostics.set(document.uri, diagnostics);
});
}, 750);
source.token.onCancellationRequested(() => clearTimeout(handle));
this._documentValidations[key] = source;
}
private _validateProject(): void {
if (!this._validationAdvisor.shouldValidateProject()) {
return;
}
if (this._projectValidation) {
this._projectValidation.cancel();
}
this._projectValidation = new CancellationTokenSource();
let handle = setTimeout(() => {
this._server.makeRequest<proto.QuickFixResponse>(proto.CodeCheck, {}, this._projectValidation.token).then(value => {
let quickFixes = value.QuickFixes.sort((a, b) => a.FileName.localeCompare(b.FileName));
let entries: [Uri, Diagnostic[]][] = [];
let lastEntry: [Uri, Diagnostic[]];
for (let quickFix of quickFixes) {
let diag = DiagnosticsProvider._asDiagnostic(quickFix);
let uri = Uri.file(quickFix.FileName);
if (lastEntry && lastEntry[0].toString() === uri.toString()) {
lastEntry[1].push(diag);
} else {
lastEntry = [uri, [diag]];
entries.push(lastEntry);
}
}
// replace all entries
this._diagnostics.set(entries);
});
}, 3000);
// clear timeout on cancellation
this._projectValidation.token.onCancellationRequested(() => {
clearTimeout(handle);
});
}
// --- data converter
private static _asDiagnostic(quickFix: proto.QuickFix): Diagnostic {
let severity = DiagnosticsProvider._asDiagnosticSeverity(quickFix.LogLevel);
let message = `${quickFix.Text} [${quickFix.Projects.map(n => DiagnosticsProvider._asProjectLabel(n)).join(', ') }]`;
return new Diagnostic(toRange(quickFix), message, severity);
}
private static _asDiagnosticSeverity(logLevel: string): DiagnosticSeverity {
switch (logLevel.toLowerCase()) {
case 'hidden':
case 'warning':
case 'warn':
return DiagnosticSeverity.Warning;
default:
return DiagnosticSeverity.Error;
}
}
private static _asProjectLabel(projectName: string): string {
var idx = projectName.indexOf('+');
return projectName.substr(idx + 1);
}
}

View file

@ -1,31 +0,0 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import AbstractSupport from './abstractProvider';
import * as proto from '../protocol';
import {createRequest, toRange} from '../typeConvertion';
import {DocumentHighlightProvider, DocumentHighlight, DocumentHighlightKind, Uri, CancellationToken, TextDocument, Position, Range} from 'vscode';
export default class OmnisharpDocumentHighlightProvider extends AbstractSupport implements DocumentHighlightProvider {
public provideDocumentHighlights(resource: TextDocument, position: Position, token: CancellationToken): Promise<DocumentHighlight[]> {
let req = createRequest<proto.FindUsagesRequest>(resource, position);
req.OnlyThisFile = true;
req.ExcludeDefinition = false;
return this._server.makeRequest<proto.QuickFixResponse>(proto.FindUsages, req, token).then(res => {
if (res && Array.isArray(res.QuickFixes)) {
return res.QuickFixes.map(OmnisharpDocumentHighlightProvider._asDocumentHighlight);
}
});
}
private static _asDocumentHighlight(quickFix: proto.QuickFix): DocumentHighlight {
return new DocumentHighlight(toRange(quickFix), DocumentHighlightKind.Read);
}
}

View file

@ -1,28 +0,0 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import AbstractSupport from './abstractProvider';
import * as Protocol from '../protocol';
import {toDocumentSymbol} from '../typeConvertion';
import {DocumentSymbolProvider, SymbolInformation, SymbolKind, Uri, TextDocument, Range, CancellationToken} from 'vscode';
export default class OmnisharpDocumentSymbolProvider extends AbstractSupport implements DocumentSymbolProvider {
public provideDocumentSymbols(document: TextDocument, token: CancellationToken): Promise<SymbolInformation[]> {
return this._server.makeRequest<Protocol.CurrentFileMembersAsTreeResponse>(Protocol.CurrentFileMembersAsTree, {Filename: document.fileName}, token).then(tree => {
var ret: SymbolInformation[] = [];
for (let node of tree.TopLevelTypeDefinitions) {
toDocumentSymbol(ret, node);
}
return ret;
});
}
}

View file

@ -1,52 +0,0 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import AbstractSupport from './abstractProvider';
import * as proto from '../protocol';
import {Uri, DocumentRangeFormattingEditProvider, OnTypeFormattingEditProvider, FormattingOptions, CancellationToken, TextEdit, TextDocument, Range, Position} from 'vscode';
export default class FormattingSupport extends AbstractSupport implements DocumentRangeFormattingEditProvider {
public provideDocumentRangeFormattingEdits(document: TextDocument, range: Range, options: FormattingOptions, token: CancellationToken): Promise<TextEdit[]> {
let request = <proto.FormatRangeRequest>{
Filename: document.fileName,
Line: range.start.line + 1,
Column: range.start.character + 1,
EndLine: range.end.line + 1,
EndColumn: range.end.character + 1
};
return this._server.makeRequest<proto.FormatRangeResponse>(proto.FormatRange, request, token).then(res => {
if (res && Array.isArray(res.Changes)) {
return res.Changes.map(FormattingSupport._asEditOptionation);
}
});
}
public provideOnTypeFormattingEdits(document: TextDocument, position: Position, ch: string, options: FormattingOptions, token: CancellationToken): Promise<TextEdit[]> {
let request = <proto.FormatAfterKeystrokeRequest> {
Filename: document.fileName,
Line: position.line + 1,
Column: position.character + 1,
Character: ch
};
return this._server.makeRequest<proto.FormatRangeResponse>(proto.FormatAfterKeystroke, request, token).then(res => {
if (res && Array.isArray(res.Changes)) {
return res.Changes.map(FormattingSupport._asEditOptionation);
}
});
}
private static _asEditOptionation(change: proto.TextChange): TextEdit {
return new TextEdit(
new Range(change.StartLine - 1, change.StartColumn - 1, change.EndLine - 1, change.EndColumn - 1),
change.NewText);
}
}

View file

@ -1,28 +0,0 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import {plain} from './documentation';
import AbstractSupport from './abstractProvider';
import * as Protocol from '../protocol';
import {createRequest} from '../typeConvertion';
import {HoverProvider, Hover, TextDocument, CancellationToken, Range, Position} from 'vscode';
export default class OmniSharpHoverProvider extends AbstractSupport implements HoverProvider {
public provideHover(document: TextDocument, position: Position, token: CancellationToken): Promise<Hover> {
let req = createRequest<Protocol.TypeLookupRequest>(document, position);
req.IncludeDocumentation = true;
return this._server.makeRequest<Protocol.TypeLookupResponse>(Protocol.TypeLookup, req, token).then(value => {
if (value && value.Type) {
let contents = [plain(value.Documentation), { language: 'csharp', value: value.Type }];
return new Hover(contents);
}
});
}
}

View file

@ -1,259 +0,0 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import * as vscode from 'vscode';
import {OmnisharpServer} from '../omnisharpServer';
import {dnxRestoreForProject} from './commands';
import {basename} from 'path';
import * as proto from '../protocol';
export default function reportStatus(server: OmnisharpServer) {
return vscode.Disposable.from(
reportServerStatus(server),
forwardOutput(server),
reportDocumentStatus(server));
}
// --- document status
let defaultSelector: vscode.DocumentSelector = [
'csharp', // c#-files OR
{ pattern: '**/project.json' }, // project.json-files OR
{ pattern: '**/*.sln' }, // any solution file OR
{ pattern: '**/*.csproj' } // an csproj file
];
class Status {
selector: vscode.DocumentSelector;
text: string;
command: string;
color: string;
constructor(selector: vscode.DocumentSelector) {
this.selector = selector;
}
}
export function reportDocumentStatus(server: OmnisharpServer): vscode.Disposable {
let disposables: vscode.Disposable[] = [];
let entry = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Right, Number.MIN_VALUE);
let defaultStatus = new Status(defaultSelector);
let projectStatus: Status;
function render() {
if (!vscode.window.activeTextEditor) {
entry.hide();
return;
}
let document = vscode.window.activeTextEditor.document;
let status: Status;
if (projectStatus && vscode.languages.match(projectStatus.selector, document)) {
status = projectStatus;
} else if (defaultStatus.text && vscode.languages.match(defaultStatus.selector, document)) {
status = defaultStatus;
}
if (status) {
entry.text = status.text;
entry.command = status.command;
entry.color = status.color;
entry.show();
return;
}
entry.hide();
}
disposables.push(vscode.window.onDidChangeActiveTextEditor(render));
disposables.push(server.onServerError(err => {
defaultStatus.text = '$(flame) Error starting OmniSharp';
defaultStatus.command = 'o.showOutput';
defaultStatus.color = '';
render();
}));
disposables.push(server.onMultipleLaunchTargets(targets => {
defaultStatus.text = '$(flame) Select project';
defaultStatus.command = 'o.pickProjectAndStart';
defaultStatus.color = 'rgb(90, 218, 90)';
render();
}));
disposables.push(server.onBeforeServerStart(path => {
defaultStatus.text = '$(flame) Starting...';
defaultStatus.command = 'o.showOutput';
defaultStatus.color = '';
render();
}));
disposables.push(server.onServerStop(() => {
projectStatus = undefined;
defaultStatus.text = undefined;
}));
disposables.push(server.onServerStart(path => {
defaultStatus.text = '$(flame) Running';
defaultStatus.command = 'o.pickProjectAndStart';
defaultStatus.color = '';
render();
function updateProjectInfo() {
server.makeRequest<proto.WorkspaceInformationResponse>(proto.Projects).then(info => {
let fileNames: vscode.DocumentSelector[] = [];
let label: string;
// show sln-file if applicable
if (info.MSBuild.SolutionPath) {
label = basename(info.MSBuild.SolutionPath)//workspace.getRelativePath(info.MSBuild.SolutionPath);
fileNames.push({ pattern: info.MSBuild.SolutionPath });
for (let project of info.MSBuild.Projects) {
fileNames.push({ pattern: project.Path });
for (let sourceFile of project.SourceFiles) {
fileNames.push({ pattern: sourceFile });
}
}
}
// show dnx projects if applicable
let count = 0;
for (let project of info.Dnx.Projects) {
count += 1;
fileNames.push({ pattern: project.Path });
for (let sourceFile of project.SourceFiles) {
fileNames.push({ pattern: sourceFile });
}
}
if (label) {
// we already have a message from a sln-file
} else if (count === 1) {
label = basename(info.Dnx.Projects[0].Path)//workspace.getRelativePath(info.Dnx.Projects[0].Path);
} else {
label = `${count} projects`;
}
// set project info
projectStatus = new Status(fileNames);
projectStatus.text = '$(flame) ' + label;
projectStatus.command = 'o.pickProjectAndStart';
// default is to change project
defaultStatus.text = '$(flame) Switch projects';
defaultStatus.command = 'o.pickProjectAndStart';
render();
});
}
disposables.push(server.onProjectAdded(updateProjectInfo));
disposables.push(server.onProjectChange(updateProjectInfo));
disposables.push(server.onProjectRemoved(updateProjectInfo));
}));
return vscode.Disposable.from(...disposables);
}
// ---- server status
export function reportServerStatus(server: OmnisharpServer): vscode.Disposable{
function appendLine(value: string = '') {
server.getChannel().appendLine(value);
}
let d0 = server.onServerError(err => {
appendLine('[ERROR] ' + err);
});
let d1 = server.onError(message => {
if (message.FileName) {
appendLine(`${message.FileName}(${message.Line},${message.Column})`);
}
appendLine(message.Text);
appendLine();
showMessageSoon();
});
let d2 = server.onMsBuildProjectDiagnostics(message => {
function asErrorMessage(message: proto.MSBuildDiagnosticsMessage) {
let value = `${message.FileName}(${message.StartLine},${message.StartColumn}): Error: ${message.Text}`;
appendLine(value);
}
function asWarningMessage(message: proto.MSBuildDiagnosticsMessage) {
let value = `${message.FileName}(${message.StartLine},${message.StartColumn}): Warning: ${message.Text}`;
appendLine(value);
}
if (message.Errors.length > 0 || message.Warnings.length > 0) {
appendLine(message.FileName);
message.Errors.forEach(error => asErrorMessage);
message.Warnings.forEach(warning => asWarningMessage);
appendLine();
showMessageSoon();
}
});
let d3 = server.onUnresolvedDependencies(message => {
let info = `There are unresolved dependencies from '${vscode.workspace.asRelativePath(message.FileName) }'. Please execute the restore command to continue.`;
return vscode.window.showInformationMessage(info, 'Restore').then(value => {
if (value) {
dnxRestoreForProject(server, message.FileName);
}
});
});
return vscode.Disposable.from(d0, d1, d2, d3);
}
// show user message
let _messageHandle: number;
function showMessageSoon() {
clearTimeout(_messageHandle);
_messageHandle = setTimeout(function() {
let message = "Some projects have trouble loading. Please review the output for more details.";
vscode.window.showWarningMessage(message, { title: "Show Output", command: 'o.showOutput' }).then(value => {
if (value) {
vscode.commands.executeCommand(value.command);
}
});
}, 1500);
}
// --- mirror output in channel
function forwardOutput(server: OmnisharpServer) {
const logChannel = server.getChannel();
const timing200Pattern = /^\[INFORMATION:OmniSharp.Middleware.LoggingMiddleware\] \/\w+: 200 \d+ms/;
function forward(message: string) {
// strip stuff like: /codecheck: 200 339ms
if(!timing200Pattern.test(message)) {
logChannel.append(message);
}
}
return vscode.Disposable.from(
server.onStdout(forward),
server.onStderr(forward));
}

View file

@ -1,27 +0,0 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import AbstractSupport from './abstractProvider';
import * as Protocol from '../protocol';
import {createRequest, toLocation} from '../typeConvertion';
import {ReferenceProvider, Location, Range, TextDocument, Uri, CancellationToken, Position} from 'vscode';
export default class OmnisharpReferenceProvider extends AbstractSupport implements ReferenceProvider {
public provideReferences(document: TextDocument, position: Position, options: { includeDeclaration: boolean;}, token: CancellationToken): Promise<Location[]> {
let req = createRequest<Protocol.FindUsagesRequest>(document, position);
req.OnlyThisFile = false;
req.ExcludeDefinition = false;
return this._server.makeRequest<Protocol.QuickFixResponse>(Protocol.FindUsages, req, token).then(res => {
if (res && Array.isArray(res.QuickFixes)) {
return res.QuickFixes.map(toLocation);
}
});
}
}

View file

@ -1,40 +0,0 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import AbstractSupport from './abstractProvider';
import * as proto from '../protocol';
import {createRequest, toRange} from '../typeConvertion';
import {RenameProvider, TextEdit, WorkspaceEdit, TextDocument, Uri, CancellationToken, Position, Range} from 'vscode';
export default class OmnisharpRenameProvider extends AbstractSupport implements RenameProvider {
public provideRenameEdits(document: TextDocument, position: Position, newName: string, token: CancellationToken): Promise<WorkspaceEdit> {
let request = createRequest<proto.RenameRequest>(document, position);
request.WantsTextChanges = true,
request.RenameTo = newName;
return this._server.makeRequest<proto.RenameResponse>(proto.Rename, request, token).then(response => {
if (!response) {
return;
}
const edit = new WorkspaceEdit();
response.Changes.forEach(change => {
const uri = Uri.file(change.FileName);
change.Changes.forEach(change => {
edit.replace(uri,
new Range(change.StartLine - 1, change.StartColumn - 1, change.EndLine - 1, change.EndColumn - 1),
change.NewText);
});
});
return edit;
});
}
}

View file

@ -1,42 +0,0 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import AbstractSupport from './abstractProvider';
import * as Protocol from '../protocol';
import {createRequest} from '../typeConvertion';
import {SignatureHelpProvider, SignatureHelp, SignatureInformation, ParameterInformation, Uri, CancellationToken, TextDocument, Position} from 'vscode';
export default class OmniSharpSignatureHelpProvider extends AbstractSupport implements SignatureHelpProvider {
public provideSignatureHelp(document: TextDocument, position: Position, token: CancellationToken): Promise<SignatureHelp> {
let req = createRequest(document, position);
return this._server.makeRequest<Protocol.SignatureHelp>(Protocol.SignatureHelp, req, token).then(res => {
let ret = new SignatureHelp();
ret.activeSignature = res.ActiveSignature;
ret.activeParameter = res.ActiveParameter;
for(let signature of res.Signatures) {
let signatureInfo = new SignatureInformation(signature.Label, signature.Documentation);
ret.signatures.push(signatureInfo);
for (let parameter of signature.Parameters) {
let parameterInfo = new ParameterInformation(
parameter.Label,
parameter.Documentation);
signatureInfo.parameters.push(parameterInfo);
}
}
return ret;
});
}
}

View file

@ -1,45 +0,0 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import AbstractSupport from './abstractProvider';
import * as Protocol from '../protocol';
import {createRequest, toRange} from '../typeConvertion';
import {CancellationToken, Uri, Range, WorkspaceSymbolProvider, SymbolInformation, SymbolKind} from 'vscode';
export default class OmnisharpWorkspaceSymbolProvider extends AbstractSupport implements WorkspaceSymbolProvider {
public provideWorkspaceSymbols(search: string, token: CancellationToken): Promise<SymbolInformation[]> {
return this._server.makeRequest<Protocol.FindSymbolsResponse>(Protocol.FindSymbols, <Protocol.FindSymbolsRequest> {
Filter: search,
Filename: ''
}, token).then(res => {
if (res && Array.isArray(res.QuickFixes)) {
return res.QuickFixes.map(OmnisharpWorkspaceSymbolProvider._asSymbolInformation);
}
});
}
private static _asSymbolInformation(symbolInfo: Protocol.SymbolLocation): SymbolInformation {
return new SymbolInformation(symbolInfo.Text, OmnisharpWorkspaceSymbolProvider._toKind(symbolInfo),
toRange(symbolInfo),
Uri.file(symbolInfo.FileName));
}
private static _toKind(symbolInfo: Protocol.SymbolLocation): SymbolKind {
switch (symbolInfo.Kind) {
case 'Method':
return SymbolKind.Method;
case 'Field':
case 'Property':
return SymbolKind.Field;
}
return SymbolKind.Class;
}
}

View file

@ -1,82 +0,0 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import * as paths from 'path';
import {EventEmitter} from 'events';
import {Uri, workspace} from 'vscode';
export interface LaunchTarget {
label: string;
description: string;
directory: Uri;
resource: Uri;
target: Uri;
}
export default function getLaunchTargets(): Thenable<LaunchTarget[]> {
return workspace.findFiles('{**/*.sln,**/*.csproj,**/project.json}', '{**/node_modules/**,**/.git/**,**/bower_components/**}', 100).then(resources => {
return select(resources, Uri.file(workspace.rootPath));
});
}
function select(resources: Uri[], root: Uri): LaunchTarget[] {
if (!Array.isArray(resources)) {
return [];
}
var targets: LaunchTarget[] = [],
hasCsProjFiles = false,
hasProjectJson = false,
hasProjectJsonAtRoot = false;
hasCsProjFiles = resources
.some(resource => /\.csproj$/.test(resource.fsPath));
resources.forEach(resource => {
// sln files
if (hasCsProjFiles && /\.sln$/.test(resource.fsPath)) {
targets.push({
label: paths.basename(resource.fsPath),
description: workspace.asRelativePath(paths.dirname(resource.fsPath)),
resource,
target: resource,
directory: Uri.file(paths.dirname(resource.fsPath))
});
}
// project.json files
if (/project.json$/.test(resource.fsPath)) {
var dirname = paths.dirname(resource.fsPath);
hasProjectJson = true;
hasProjectJsonAtRoot = hasProjectJsonAtRoot || dirname === root.fsPath;
targets.push({
label: paths.basename(resource.fsPath),
description: workspace.asRelativePath(paths.dirname(resource.fsPath)),
resource,
target: Uri.file(dirname),
directory: Uri.file(dirname)
});
}
});
if (hasProjectJson && !hasProjectJsonAtRoot) {
targets.push({
label: paths.basename(root.fsPath),
description: '',
resource: root,
target: root,
directory: root
});
}
return targets.sort((a, b) => a.directory.fsPath.localeCompare(b.directory.fsPath));
}

View file

@ -1,82 +0,0 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import DefinitionProvider from './features/definitionProvider';
import CodeLensProvider from './features/codeLensProvider';
import DocumentHighlightProvider from './features/documentHighlightProvider';
import DocumentSymbolProvider from './features/documentSymbolProvider';
import CodeActionProvider from './features/codeActionProvider';
import ReferenceProvider from './features/referenceProvider';
import HoverProvider from './features/hoverProvider';
import RenameProvider from './features/renameProvider';
import FormatProvider from './features/formattingEditProvider';
import CompletionItemProvider from './features/completionItemProvider';
import WorkspaceSymbolProvider from './features/workspaceSymbolProvider';
import reportDiagnostics,{Advisor} from './features/diagnosticsProvider';
import SignatureHelpProvider from './features/signatureHelpProvider';
import registerCommands from './features/commands';
import {StdioOmnisharpServer} from './omnisharpServer';
import forwardChanges from './features/changeForwarding';
import reportStatus from './features/omnisharpStatus';
import findLaunchTargets from './launchTargetFinder';
import {Disposable, ExtensionContext, languages, extensions} from 'vscode';
export function activate(context: ExtensionContext): any {
const _selector: vscode.DocumentSelector = {
language: 'csharp',
scheme: 'file' // only files from disk
};
const server = new StdioOmnisharpServer();
let advisor = new Advisor(server);
let disposables: Disposable[] = [];
let localDisposables: Disposable[] = [];
disposables.push(server.onServerStart(() => {
// register language feature provider on start
localDisposables.push(languages.registerDefinitionProvider(_selector, new DefinitionProvider(server)));
localDisposables.push(languages.registerCodeLensProvider(_selector, new CodeLensProvider(server)));
localDisposables.push(languages.registerDocumentHighlightProvider(_selector, new DocumentHighlightProvider(server)));
localDisposables.push(languages.registerDocumentSymbolProvider(_selector, new DocumentSymbolProvider(server)));
localDisposables.push(languages.registerReferenceProvider(_selector, new ReferenceProvider(server)));
localDisposables.push(languages.registerHoverProvider(_selector, new HoverProvider(server)));
localDisposables.push(languages.registerRenameProvider(_selector, new RenameProvider(server)));
localDisposables.push(languages.registerDocumentRangeFormattingEditProvider(_selector, new FormatProvider(server)));
localDisposables.push(languages.registerOnTypeFormattingEditProvider(_selector, new FormatProvider(server), '}', ';'));
localDisposables.push(languages.registerCompletionItemProvider(_selector, new CompletionItemProvider(server), '.', '<'));
localDisposables.push(languages.registerWorkspaceSymbolProvider(new WorkspaceSymbolProvider(server)));
localDisposables.push(languages.registerSignatureHelpProvider(_selector, new SignatureHelpProvider(server), '(', ','));
let codeActionProvider = new CodeActionProvider(server);
localDisposables.push(codeActionProvider);
localDisposables.push(languages.registerCodeActionsProvider(_selector, codeActionProvider));
localDisposables.push(reportDiagnostics(server, advisor));
localDisposables.push(forwardChanges(server));
}));
disposables.push(server.onServerStop(() => {
// remove language feature providers on stop
Disposable.from(...localDisposables).dispose();
}));
disposables.push(registerCommands(server));
disposables.push(reportStatus(server));
// read and store last solution or folder path
server.autoStart(context.workspaceState.get<string>('lastSolutionPathOrFolder'));
server.onBeforeServerStart(path => context.workspaceState.update('lastSolutionPathOrFolder', path));
// stop server on deactivate
disposables.push(new Disposable(() => {
advisor.dispose();
server.stop();
}));
context.subscriptions.push(...disposables);
}

View file

@ -1,507 +0,0 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import {EventEmitter} from 'events';
import {ChildProcess, exec} from 'child_process';
import {request} from 'http';
import {dirname} from 'path';
import {ReadLine, createInterface} from 'readline';
import omnisharpLauncher from './omnisharpServerLauncher';
import {Disposable, CancellationToken, OutputChannel, workspace, window} from 'vscode';
import {ErrorMessage, UnresolvedDependenciesMessage, MSBuildProjectDiagnostics, ProjectInformationResponse} from './protocol';
import getLaunchTargets, {LaunchTarget} from './launchTargetFinder';
enum ServerState {
Starting,
Started,
Stopped
}
interface Request {
path: string;
data?: any;
onSuccess: Function;
onError: Function;
_enqueued: number;
}
export abstract class OmnisharpServer {
private _eventBus = new EventEmitter();
private _start: Promise<void>;
private _state: ServerState = ServerState.Stopped;
private _solutionPath: string;
private _queue: Request[] = [];
private _isProcessingQueue = false;
private _channel: OutputChannel;
protected _serverProcess: ChildProcess;
protected _extraArgv: string[];
constructor() {
this._extraArgv = [];
this._channel = window.createOutputChannel('OmniSharp Log');
}
public isRunning(): boolean {
return this._state === ServerState.Started;
}
private _getState(): ServerState {
return this._state;
}
private _setState(value: ServerState) : void {
if (typeof value !== 'undefined' && value !== this._state) {
this._state = value;
this._fireEvent('stateChanged', this._state);
}
}
public getSolutionPathOrFolder(): string {
return this._solutionPath;
}
public getChannel(): vscode.OutputChannel {
return this._channel;
}
public onStdout(listener: (e: string) => any, thisArg?: any) {
return this._addListener('stdout', listener, thisArg);
}
public onStderr(listener: (e: string) => any, thisArg?: any) {
return this._addListener('stderr', listener, thisArg);
}
public onError(listener: (e: ErrorMessage) => any, thisArg?: any) {
return this._addListener('Error', listener, thisArg);
}
public onServerError(listener: (err: any) => any, thisArg?: any) {
return this._addListener('ServerError', listener, thisArg);
}
public onUnresolvedDependencies(listener: (e: UnresolvedDependenciesMessage) => any, thisArg?:any) {
return this._addListener('UnresolvedDependencies', listener, thisArg);
}
public onBeforePackageRestore(listener: () => any, thisArg?: any) {
return this._addListener('PackageRestoreStarted', listener, thisArg);
}
public onPackageRestore(listener: () => any, thisArg?: any) {
return this._addListener('PackageRestoreFinished', listener, thisArg);
}
public onProjectChange(listener: (e: ProjectInformationResponse) => any, thisArg?: any) {
return this._addListener('ProjectChanged', listener, thisArg);
}
public onProjectAdded(listener: (e: ProjectInformationResponse) => any, thisArg?: any) {
return this._addListener('ProjectAdded', listener, thisArg);
}
public onProjectRemoved(listener: (e: ProjectInformationResponse) => any, thisArg?: any) {
return this._addListener('ProjectRemoved', listener, thisArg);
}
public onMsBuildProjectDiagnostics(listener: (e: MSBuildProjectDiagnostics) => any, thisArg?: any) {
return this._addListener('MsBuildProjectDiagnostics', listener, thisArg);
}
public onBeforeServerStart(listener: (e:string) => any) {
return this._addListener('BeforeServerStart', listener);
}
public onServerStart(listener: (e: string) => any) {
return this._addListener('ServerStart', listener);
}
public onServerStop(listener: () => any) {
return this._addListener('ServerStop', listener);
}
public onMultipleLaunchTargets(listener: (targets: LaunchTarget[]) => any, thisArg?: any) {
return this._addListener('server:MultipleLaunchTargets', listener, thisArg);
}
public onOmnisharpStart(listener: () => any) {
return this._addListener('started', listener);
}
private _addListener(event: string, listener: (e: any) => any, thisArg?: any): Disposable {
listener = thisArg ? listener.bind(thisArg) : listener;
this._eventBus.addListener(event, listener);
return new Disposable(() => this._eventBus.removeListener(event, listener));
}
protected _fireEvent(event: string, args: any): void {
this._eventBus.emit(event, args);
}
public start(solutionPath: string): Promise<void> {
if (!this._start) {
this._start = this._doStart(solutionPath);
}
return this._start;
}
private _doStart(solutionPath: string): Promise<void> {
this._setState(ServerState.Starting);
this._solutionPath = solutionPath;
var cwd = dirname(solutionPath),
argv = ['-s', solutionPath, '--hostPID', process.pid.toString(), 'dnx:enablePackageRestore=false'].concat(this._extraArgv);
this._fireEvent('stdout', `[INFO] Starting OmniSharp at '${solutionPath}'...\n`);
this._fireEvent('BeforeServerStart', solutionPath);
return omnisharpLauncher(cwd, argv).then(value => {
this._serverProcess = value.process;
this._fireEvent('stdout', `[INFO] Started OmniSharp from '${value.command}' with process id ${value.process.pid}...\n`);
return this._doConnect();
}).then(_ => {
this._fireEvent('ServerStart', solutionPath);
this._setState(ServerState.Started);
this._processQueue();
}, err => {
this._fireEvent('ServerError', err);
throw err;
});
}
protected abstract _doConnect(): Promise<OmnisharpServer>;
public stop(): Promise<void> {
var ret: Promise<OmnisharpServer>;
if (!this._serverProcess) {
// nothing to kill
ret = Promise.resolve(undefined);
} else if (/^win/.test(process.platform)) {
// when killing a process in windows its child
// processes are *not* killed but become root
// processes. Therefore we use TASKKILL.EXE
ret = new Promise<OmnisharpServer>((resolve, reject) => {
var killer = exec(`taskkill /F /T /PID ${this._serverProcess.pid}`, function (err, stdout, stderr) {
if (err) {
return reject(err);
}
});
killer.on('exit', resolve);
killer.on('error', reject);
});
} else {
this._serverProcess.kill('SIGTERM');
ret = Promise.resolve(undefined);
}
return ret.then(_ => {
this._start = null;
this._serverProcess = null;
this._setState(ServerState.Stopped);
this._fireEvent('ServerStop', this);
return;
});
}
public restart(solutionPath: string = this._solutionPath): Promise<void> {
if (solutionPath) {
return this.stop().then(() => {
this.start(solutionPath)
});
}
}
public autoStart(preferredPath:string): Thenable<void> {
return getLaunchTargets().then(targets => {
if (targets.length === 0) {
return new Promise<void>((resolve, reject) => {
// 1st watch for files
let watcher = workspace.createFileSystemWatcher('{**/*.sln,**/project.json}', false, true, true);
watcher.onDidCreate(uri => {
watcher.dispose();
resolve();
});
}).then(() => {
// 2nd try again
return this.autoStart(preferredPath);
});
}
if (targets.length > 1) {
for (let target of targets) {
if (target.target.fsPath === preferredPath) {
// start preferred path
return this.restart(preferredPath);
}
}
this._fireEvent('server:MultipleLaunchTargets', targets);
return Promise.reject<void>(undefined);
}
// just start
return this.restart(targets[0].target.fsPath);
});
}
public makeRequest<R>(path: string, data?: any, token?: CancellationToken): Promise<R> {
if (this._getState() !== ServerState.Started) {
return Promise.reject<R>('server has been stopped or not started');
}
let request: Request;
let promise = new Promise<any>((resolve, reject) => {
request = {
path,
data,
onSuccess: resolve,
onError: reject,
_enqueued: Date.now()
};
this._queue.push(request);
// this._statOnRequestStart(request);
if (this._getState() === ServerState.Started && !this._isProcessingQueue) {
this._processQueue();
}
});
if (token) {
token.onCancellationRequested(() => {
let idx = this._queue.indexOf(request);
if (idx !== -1) {
this._queue.splice(idx, 1);
let err = new Error('Canceled');
err.message = 'Canceled';
request.onError(err);
}
});
}
return promise;
}
private _processQueue(): void {
if (this._queue.length === 0) {
// nothing to do
this._isProcessingQueue = false;
return;
}
// signal that we are working on it
this._isProcessingQueue = true;
// send next request and recurse when done
var thisRequest = this._queue.shift();
this._makeNextRequest(thisRequest.path, thisRequest.data).then(value => {
thisRequest.onSuccess(value);
this._processQueue();
// this._statOnRequestEnd(thisRequest, true);
}, err => {
thisRequest.onError(err);
this._processQueue();
// this._statOnRequestEnd(thisRequest, false);
}).catch(err => {
console.error(err);
this._processQueue();
});
}
protected abstract _makeNextRequest(path: string, data: any): Promise<any>;
// private _statOnRequestStart(request: Request): void {
// console.log(`[DEBUG] *enqueuing* request '${request.path}' (queue size is ${this._queue.length})\n`);
// }
// private _statOnRequestEnd(request: Request, successfully: boolean): void {
// var duration = Date.now() - request._enqueued,
// state = successfully ? 'successfully' : 'with errors';
// console.log(`[DEBUG] request '${request.path}' finished *${state}* after ${duration}ms\n`);
// }
}
namespace WireProtocol {
export interface Packet {
Type: string;
Seq: number;
}
export interface RequestPacket extends Packet {
Command: string;
Arguments: any;
}
export interface ResponsePacket extends Packet {
Command: string;
Request_seq: number;
Running: boolean;
Success: boolean;
Message: string;
Body: any;
}
export interface EventPacket extends Packet {
Event: string;
Body: any;
}
}
export class StdioOmnisharpServer extends OmnisharpServer {
private static _seqPool = 1;
private static StartupTimeout = 1000 * 60;
private static ResponsePacketTimeout = 1000 * 60 * 15; // helps debugging
private _rl: ReadLine;
private _activeRequest: { [seq: number]: { onSuccess: Function; onError: Function; } } = Object.create(null);
private _callOnStop: Function[] = [];
constructor() {
super();
// extra argv
this._extraArgv.push('--stdio');
}
public stop(): Promise<void> {
while (this._callOnStop.length) {
this._callOnStop.pop()();
}
return super.stop();
}
protected _doConnect(): Promise<OmnisharpServer> {
this._serverProcess.stderr.on('data', (data: any) => this._fireEvent('stderr', String(data)));
this._rl = createInterface({
input: this._serverProcess.stdout,
output: this._serverProcess.stdin,
terminal: false
});
var p = new Promise<OmnisharpServer>((resolve, reject) => {
var listener: Disposable;
// timeout logic
var handle = setTimeout(() => {
listener && listener.dispose();
reject(new Error('Failed to start OmniSharp'));
}, StdioOmnisharpServer.StartupTimeout);
// handle started-event
listener = this.onOmnisharpStart(() => {
listener && listener.dispose();
clearTimeout(handle);
resolve(this);
});
});
this._startListening();
return p;
}
private _startListening(): void {
var onLineReceived = (line: string) => {
if (line[0] !== '{') {
this._fireEvent('stdout', `${line}\n`);
return;
}
var packet: WireProtocol.Packet;
try {
packet = JSON.parse(line);
} catch (e) {
// not json
return;
}
if (!packet.Type) {
// bogous packet
return;
}
switch (packet.Type) {
case 'response':
this._handleResponsePacket(<WireProtocol.ResponsePacket> packet);
break;
case 'event':
this._handleEventPacket(<WireProtocol.EventPacket> packet);
break;
default:
console.warn('unknown packet: ', packet);
break;
}
};
this._rl.addListener('line', onLineReceived);
this._callOnStop.push(() => this._rl.removeListener('line', onLineReceived));
}
private _handleResponsePacket(packet: WireProtocol.ResponsePacket): void {
var requestSeq = packet.Request_seq,
entry = this._activeRequest[requestSeq];
if (!entry) {
console.warn('Received a response WITHOUT a request', packet);
return;
}
delete this._activeRequest[requestSeq];
if (packet.Success) {
entry.onSuccess(packet.Body);
} else {
entry.onError(packet.Message || packet.Body);
}
}
private _handleEventPacket(packet: WireProtocol.EventPacket): void {
if (packet.Event === 'log') {
// handle log events
var entry = <{ LogLevel: string; Name: string; Message: string; }> packet.Body;
this._fireEvent('stdout', `[${entry.LogLevel}:${entry.Name}] ${entry.Message}\n`);
return;
} else {
// fwd all other events
this._fireEvent(packet.Event, packet.Body);
}
}
protected _makeNextRequest(path: string, data: any): Promise<any> {
var thisRequestPacket: WireProtocol.RequestPacket = {
Type: 'request',
Seq: StdioOmnisharpServer._seqPool++,
Command: path,
Arguments: data
};
return new Promise<any>((c, e) => {
this._activeRequest[thisRequestPacket.Seq] = {
onSuccess: c,
onError: e
};
this._serverProcess.stdin.write(JSON.stringify(thisRequestPacket) + '\n');
});
}
}

View file

@ -1,161 +0,0 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import {exists as fileExists} from 'fs';
import {spawn, ChildProcess} from 'child_process';
import {workspace} from 'vscode';
import {satisfies} from 'semver';
import {join} from 'path';
var omnisharpEnv = 'OMNISHARP';
var isWindows = /^win/.test(process.platform);
export default function launch(cwd: string, args: string[]):Promise < { process: ChildProcess, command: string } > {
return new Promise((resolve, reject) => {
try {
(isWindows ? launchWindows(cwd, args) : launchNix(cwd, args)).then(value => {
// async error - when target not not ENEOT
value.process.on('error', reject);
// success after a short freeing event loop
setTimeout(function () {
resolve(value);
}, 0);
}, err => {
reject(err);
});
} catch (err) {
reject(err);
}
});
}
function launchWindows(cwd: string, args: string[]): Promise<{ process: ChildProcess, command: string }> {
return getOmnisharpPath().then(command => {
args = args.slice(0);
args.unshift(command);
args = [[
'/s',
'/c',
'"' + args.map(arg => /^[^"].* .*[^"]/.test(arg) ? `"${arg}"` : arg).join(' ') + '"'
].join(' ')];
let process = spawn('cmd', args, <any>{
windowsVerbatimArguments: true,
detached: false,
// env: details.env,
cwd: cwd
});
return {
process,
command
};
});
}
function launchNix(cwd: string, args: string[]): Promise<{ process: ChildProcess, command: string }>{
return new Promise((resolve, reject) => {
hasMono('>=4.0.1').then(hasIt => {
if (!hasIt) {
reject(new Error('Cannot start Omnisharp because Mono version >=4.0.1 is required. See http://go.microsoft.com/fwlink/?linkID=534832#_20001'));
} else {
resolve();
}
});
}).then(_ => {
return getOmnisharpPath();
}).then(command => {
let process = spawn(command, args, {
detached: false,
// env: details.env,
cwd
});
return {
process,
command
}
});
}
function getOmnisharpPath(): Promise<string> {
let pathCandidate: string;
let config = workspace.getConfiguration();
if (config.has('csharp.omnisharp')) {
// form config
pathCandidate = config.get<string>('csharp.omnisharp');
} else if (typeof process.env[omnisharpEnv] === 'string') {
// form enviroment variable
console.warn('[deprecated] use workspace or user settings with "csharp.omnisharp":"/path/to/omnisharp"');
pathCandidate = process.env[omnisharpEnv];
} else {
// bundled version of Omnisharp
pathCandidate = join(__dirname, '../bin/omnisharp')
if (isWindows) {
pathCandidate += '.cmd';
}
}
return new Promise<string>((resolve, reject) => {
fileExists(pathCandidate, localExists => {
if (localExists) {
resolve(pathCandidate);
} else {
reject('OmniSharp does not exist at location: ' + pathCandidate);
}
});
});
}
const versionRegexp = /(\d+\.\d+\.\d+)/;
export function hasMono(range?: string): Promise<boolean> {
return new Promise<boolean>((resolve, reject) => {
let childprocess: ChildProcess;
try {
childprocess = spawn('mono', ['--version']);
} catch (e) {
return resolve(false);
}
childprocess.on('error', function (err: any) {
resolve(false);
});
let stdout = '';
childprocess.stdout.on('data', (data: NodeBuffer) => {
stdout += data.toString();
});
childprocess.stdout.on('close', () => {
let match = versionRegexp.exec(stdout),
ret: boolean;
if (!match) {
ret = false;
} else if (!range) {
ret = true;
} else {
ret = satisfies(match[1], range);
}
resolve(ret);
});
});
}

View file

@ -1,416 +0,0 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
export var GoToDefinition = '/gotoDefinition';
export var CodeCheck = '/codecheck';
export var AutoComplete = '/autocomplete';
export var CurrentFileMembersAsTree = '/currentfilemembersastree';
export var TypeLookup = '/typelookup';
export var AddToProject = '/addtoproject';
export var RemoveFromProject = '/removefromproject';
export var FindUsages = '/findusages';
export var FindSymbols = '/findsymbols';
export var CodeFormat = '/codeformat';
export var GetCodeActions = '/getcodeactions';
export var RunCodeAction = '/runcodeaction';
export var FormatAfterKeystroke = '/formatAfterKeystroke';
export var FormatRange = '/formatRange';
export var UpdateBuffer = '/updatebuffer';
export var ChangeBuffer = '/changebuffer';
export var Projects = '/projects';
export var Rename = '/rename';
export var FilesChanged = '/filesChanged';
export var SignatureHelp = '/signatureHelp';
export interface Request {
Filename: string;
Line?: number;
Column?: number;
Buffer?: string;
}
export interface ChangeBufferRequest {
FileName: string;
StartLine: number;
StartColumn: number;
EndLine: number;
EndColumn: number;
NewText: string;
}
export interface AddToProjectRequest extends Request {
//?
}
export interface RemoveFromProjectRequest extends Request {
//?
}
export interface FindUsagesRequest extends Request {
// MaxWidth: number; ?
OnlyThisFile: boolean;
ExcludeDefinition: boolean;
}
export interface FindSymbolsRequest extends Request {
Filter: string;
}
export interface FormatRequest extends Request {
ExpandTab: boolean;
}
export interface CodeActionRequest extends Request {
CodeAction: number;
WantsTextChanges?: boolean;
SelectionStartColumn?: number;
SelectionStartLine?: number;
SelectionEndColumn?: number;
SelectionEndLine?: number;
}
export interface FormatResponse {
Buffer: string;
}
export interface TextChange {
NewText: string;
StartLine: number;
StartColumn: number;
EndLine: number;
EndColumn: number;
}
export interface FormatAfterKeystrokeRequest extends Request {
Character: string;
}
export interface FormatRangeRequest extends Request {
EndLine: number;
EndColumn: number;
}
export interface FormatRangeResponse {
Changes: TextChange[];
}
export interface ResourceLocation {
FileName: string;
Line: number;
Column: number;
}
export interface Error {
Message: string;
Line: number;
Column: number;
EndLine: number;
EndColumn: number;
FileName: string;
}
export interface ErrorResponse {
Errors: Error[];
}
export interface QuickFix {
LogLevel: string;
FileName: string;
Line: number;
Column: number;
EndLine: number;
EndColumn: number;
Text: string;
Projects: string[];
}
export interface SymbolLocation extends QuickFix {
Kind: string;
}
export interface QuickFixResponse {
QuickFixes: QuickFix[];
}
export interface FindSymbolsResponse {
QuickFixes: SymbolLocation[];
}
export interface TypeLookupRequest extends Request {
IncludeDocumentation: boolean;
}
export interface TypeLookupResponse {
Type: string;
Documentation: string;
}
export interface RunCodeActionResponse {
Text: string;
Changes: TextChange[];
}
export interface GetCodeActionsResponse {
CodeActions: string[];
}
export interface Node {
ChildNodes: Node[];
Location: QuickFix;
Kind: string;
}
export interface CurrentFileMembersAsTreeResponse {
TopLevelTypeDefinitions: Node[];
}
export interface AutoCompleteRequest extends Request {
WordToComplete: string;
WantDocumentationForEveryCompletionResult?: boolean;
WantImportableTypes?: boolean;
WantMethodHeader?: boolean;
WantSnippet?: boolean;
WantReturnType?: boolean;
WantKind?: boolean;
}
export interface AutoCompleteResponse {
CompletionText: string;
Description: string;
DisplayText: string;
RequiredNamespaceImport: string;
MethodHeader: string;
ReturnType: string;
Snippet: string;
Kind: string;
}
export interface ProjectInformationResponse {
MsBuildProject: MSBuildProject;
DnxProject: DnxProject;
}
export interface WorkspaceInformationResponse {
MSBuild: MsBuildWorkspaceInformation;
Dnx: DnxWorkspaceInformation;
ScriptCs: ScriptCsContext;
}
export interface MsBuildWorkspaceInformation {
SolutionPath: string;
Projects: MSBuildProject[];
}
export interface ScriptCsContext {
CsxFiles: { [n: string]: string };
References: { [n: string]: string };
Usings: { [n: string]: string };
ScriptPacks: { [n: string]: string };
Path: string;
}
export interface MSBuildProject {
ProjectGuid: string;
Path: string;
AssemblyName: string;
TargetPath: string;
TargetFramework: string;
SourceFiles: string[];
}
export interface DnxWorkspaceInformation {
RuntimePath: string;
DesignTimeHostPort: number;
Projects: DnxProject[];
}
export interface DnxProject {
Path: string;
Name: string;
Commands: { [name: string]: string; };
Configurations: string[];
ProjectSearchPaths: string[];
Frameworks: DnxFramework[];
GlobalJsonPath: string;
SourceFiles: string[];
}
export interface DnxFramework {
Name: string;
FriendlyName: string;
ShortName: string;
}
export interface RenameRequest extends Request {
RenameTo: string;
WantsTextChanges?: boolean;
}
export interface ModifiedFileResponse {
FileName: string;
Buffer: string;
Changes: TextChange[];
}
export interface RenameResponse {
Changes: ModifiedFileResponse[];
}
export interface SignatureHelp {
Signatures: SignatureHelpItem[];
ActiveSignature: number;
ActiveParameter: number;
}
export interface SignatureHelpItem {
Name: string;
Label: string;
Documentation: string;
Parameters: SignatureHelpParameter[];
}
export interface SignatureHelpParameter {
Name: string;
Label: string;
Documentation: string;
}
export interface MSBuildProjectDiagnostics {
FileName: string;
Warnings: MSBuildDiagnosticsMessage[];
Errors: MSBuildDiagnosticsMessage[];
}
export interface MSBuildDiagnosticsMessage {
LogLevel: string;
FileName: string;
Text: string;
StartLine: number;
StartColumn: number;
EndLine: number;
EndColumn: number;
}
export interface ErrorMessage {
Text: string;
FileName: string;
Line: number;
Column: number;
}
export interface PackageRestoreMessage {
FileName: string;
Succeeded: boolean;
}
export interface UnresolvedDependenciesMessage {
FileName: string;
UnresolvedDependencies: PackageDependency[];
}
export interface PackageDependency {
Name: string;
Version: string;
}
export namespace V2 {
export var GetCodeActions = '/v2/getcodeactions';
export var RunCodeAction = '/v2/runcodeaction';
export interface Point {
Line: number;
Column: number;
}
export interface Range {
Start: Point;
End: Point;
}
export interface GetCodeActionsRequest extends Request {
Selection: Range
}
export interface OmniSharpCodeAction {
Identifier: string;
Name: string;
}
export interface GetCodeActionsResponse {
CodeActions: OmniSharpCodeAction[];
}
export interface RunCodeActionRequest extends Request {
Identifier: string;
Selection: Range;
WantsTextChanges: boolean;
}
export interface RunCodeActionResponse {
Changes: ModifiedFileResponse[];
}
export interface MSBuildProjectDiagnostics {
FileName: string;
Warnings: MSBuildDiagnosticsMessage[];
Errors: MSBuildDiagnosticsMessage[];
}
export interface MSBuildDiagnosticsMessage {
LogLevel: string;
FileName: string;
Text: string;
StartLine: number;
StartColumn: number;
EndLine: number;
EndColumn: number;
}
export interface ErrorMessage {
Text: string;
FileName: string;
Line: number;
Column: number;
}
export interface PackageRestoreMessage {
FileName: string;
Succeeded: boolean;
}
export interface UnresolvedDependenciesMessage {
FileName: string;
UnresolvedDependencies: PackageDependency[];
}
export interface PackageDependency {
Name: string;
Version: string;
}
}

View file

@ -1,72 +0,0 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import * as proto from './protocol';
import * as vscode from 'vscode';
export function toLocation(location: proto.ResourceLocation): vscode.Location {
let {FileName, Line, Column} = location;
return new vscode.Location(vscode.Uri.file(FileName), new vscode.Position(Line - 1, Column - 1));
}
export function toRange(rangeLike: { Line: number; Column: number; EndLine: number; EndColumn: number;}): vscode.Range {
let {Line, Column, EndLine, EndColumn} = rangeLike;
return new vscode.Range(Line - 1, Column - 1, EndLine - 1, EndColumn - 1);
}
export function toRange2(rangeLike: { StartLine: number; StartColumn: number; EndLine: number; EndColumn: number;}): vscode.Range {
let {StartLine, StartColumn, EndLine, EndColumn} = rangeLike;
return new vscode.Range(StartLine - 1, StartColumn - 1, EndLine - 1, EndColumn - 1);
}
export function createRequest<T extends proto.Request>(document: vscode.TextDocument, where: vscode.Position | vscode.Range, includeBuffer:boolean = false): T {
let Line: number, Column: number;
if (where instanceof vscode.Position) {
Line = where.line + 1;
Column = where.character + 1;
} else if(where instanceof vscode.Range) {
Line = where.start.line + 1;
Column = where.start.character + 1
}
let request: proto.Request = {
Filename: document.fileName,
Buffer: includeBuffer ? document.getText() : undefined,
Line,
Column
};
return <T>request;
}
export function toDocumentSymbol(bucket: vscode.SymbolInformation[], node: proto.Node, containerLabel?: string): void {
let ret = new vscode.SymbolInformation(node.Location.Text, kinds[node.Kind],
toRange(node.Location),
undefined, containerLabel);
if (node.ChildNodes) {
for (let child of node.ChildNodes) {
toDocumentSymbol(bucket, child, ret.name)
}
}
bucket.push(ret);
}
var kinds: { [kind: string]: vscode.SymbolKind; } = Object.create(null);
kinds['NamespaceDeclaration'] = vscode.SymbolKind.Namespace;
kinds['ClassDeclaration'] = vscode.SymbolKind.Class;
kinds['FieldDeclaration'] = vscode.SymbolKind.Field;
kinds['PropertyDeclaration'] = vscode.SymbolKind.Property;
kinds['EventFieldDeclaration'] = vscode.SymbolKind.Property;
kinds['MethodDeclaration'] = vscode.SymbolKind.Method;
kinds['EnumDeclaration'] = vscode.SymbolKind.Enum;
kinds['StructDeclaration'] = vscode.SymbolKind.Enum;
kinds['EnumMemberDeclaration'] = vscode.SymbolKind.Property;
kinds['InterfaceDeclaration'] = vscode.SymbolKind.Interface;
kinds['VariableDeclaration'] = vscode.SymbolKind.Variable;

View file

@ -1,69 +0,0 @@
declare class Client {
public context: any;
public config: any;
public trackEvent(eventName: string, properties: {[key: string]: string}, measures?: {[key: string]: number}): void;
}
declare class ApplicationInsights {
static client: Client;
/**
* Initializes a client with the given instrumentation key, if this is not specified, the value will be
* read from the environment variable APPINSIGHTS_INSTRUMENTATIONKEY
* @returns {ApplicationInsights/Client} a new client
*/
static getClient(instrumentationKey?: string): Client;
/**
* Initializes the default client of the client and sets the default configuration
* @param instrumentationKey the instrumentation key to use. Optional, if this is not specified, the value will be
* read from the environment variable APPINSIGHTS_INSTRUMENTATIONKEY
* @returns {ApplicationInsights} this class
*/
static setup(instrumentationKey?: string): typeof ApplicationInsights;
/**
* Starts automatic collection of telemetry. Prior to calling start no telemetry will be collected
* @returns {ApplicationInsights} this class
*/
static start(): typeof ApplicationInsights;
/**
* Sets the state of console tracking (enabled by default)
* @param value if true console activity will be sent to Application Insights
* @returns {ApplicationInsights} this class
*/
static setAutoCollectConsole(value: boolean): typeof ApplicationInsights;
/**
* Sets the state of exception tracking (enabled by default)
* @param value if true uncaught exceptions will be sent to Application Insights
* @returns {ApplicationInsights} this class
*/
static setAutoCollectExceptions(value: boolean): typeof ApplicationInsights;
/**
* Sets the state of performance tracking (enabled by default)
* @param value if true performance counters will be collected every second and sent to Application Insights
* @returns {ApplicationInsights} this class
*/
static setAutoCollectPerformance(value: boolean): typeof ApplicationInsights;
/**
* Sets the state of request tracking (enabled by default)
* @param value if true requests will be sent to Application Insights
* @returns {ApplicationInsights} this class
*/
static setAutoCollectRequests(value: boolean): typeof ApplicationInsights;
/**
* Sets the state of enabling offline mode to cache event when client is offline (disabled by default)
* @param value if true events that happen while client is offline will be cahced on disk,
* client will retry to send events when back online
* @returns {ApplicationInsights} this class
*/
public static setOfflineMode(value: boolean): typeof ApplicationInsights;
/**
* Enables verbose debug logging
* @returns {ApplicationInsights} this class
*/
static enableVerboseLogging(): typeof ApplicationInsights;
}
declare module 'applicationinsights' {
export = ApplicationInsights;
}

View file

@ -1,125 +0,0 @@
// Type definitions for semver v2.2.1
// Project: https://github.com/isaacs/node-semver
// Definitions by: Bart van der Schoor <https://github.com/Bartvds>
// Definitions: https://github.com/borisyankov/DefinitelyTyped
declare module SemVerModule {
/**
* Return the parsed version, or null if it's not valid.
*/
function valid(v: string, loose?: boolean): string;
/**
* Return the version incremented by the release type (major, minor, patch, or prerelease), or null if it's not valid.
*/
function inc(v: string, release: string, loose?: boolean): string;
// Comparison
/**
* v1 > v2
*/
function gt(v1: string, v2: string, loose?: boolean): boolean;
/**
* v1 >= v2
*/
function gte(v1: string, v2: string, loose?: boolean): boolean;
/**
* v1 < v2
*/
function lt(v1: string, v2: string, loose?: boolean): boolean;
/**
* v1 <= v2
*/
function lte(v1: string, v2: string, loose?: boolean): boolean;
/**
* v1 == v2 This is true if they're logically equivalent, even if they're not the exact same string. You already know how to compare strings.
*/
function eq(v1: string, v2: string, loose?: boolean): boolean;
/**
* v1 != v2 The opposite of eq.
*/
function neq(v1: string, v2: string, loose?: boolean): boolean;
/**
* Pass in a comparison string, and it'll call the corresponding semver comparison function. "===" and "!==" do simple string comparison, but are included for completeness. Throws if an invalid comparison string is provided.
*/
function cmp(v1: string, comparator: any, v2: string, loose?: boolean): boolean;
/**
* Return 0 if v1 == v2, or 1 if v1 is greater, or -1 if v2 is greater. Sorts in ascending order if passed to Array.sort().
*/
function compare(v1: string, v2: string, loose?: boolean): number;
/**
* The reverse of compare. Sorts an array of versions in descending order when passed to Array.sort().
*/
function rcompare(v1: string, v2: string, loose?: boolean): number;
// Ranges
/**
* Return the valid range or null if it's not valid
*/
function validRange(range: string, loose?: boolean): string;
/**
* Return true if the version satisfies the range.
*/
function satisfies(version: string, range: string, loose?: boolean): boolean;
/**
* Return the highest version in the list that satisfies the range, or null if none of them do.
*/
function maxSatisfying(versions: string[], range: string, loose?: boolean): string;
/**
* Return true if version is greater than all the versions possible in the range.
*/
function gtr(version: string, range: string, loose?: boolean): boolean;
/**
* Return true if version is less than all the versions possible in the range.
*/
function ltr(version: string, range: string, loose?: boolean): boolean;
/**
* Return true if the version is outside the bounds of the range in either the high or low direction. The hilo argument must be either the string '>' or '<'. (This is the function called by gtr and ltr.)
*/
function outside(version: string, range: string, hilo: string, loose?: boolean): boolean;
class SemVerBase {
raw: string;
loose: boolean;
format(): string;
inspect(): string;
toString(): string;
}
class SemVer extends SemVerBase {
constructor(version: string, loose?: boolean);
major: number;
minor: number;
patch: number;
version: string;
build: string[];
prerelease: string[];
compare(other:SemVer): number;
compareMain(other:SemVer): number;
comparePre(other:SemVer): number;
inc(release: string): SemVer;
}
class Comparator extends SemVerBase {
constructor(comp: string, loose?: boolean);
semver: SemVer;
operator: string;
value: boolean;
parse(comp: string): void;
test(version:SemVer): boolean;
}
class Range extends SemVerBase {
constructor(range: string, loose?: boolean);
set: Comparator[][];
parseRange(range: string): Comparator[];
test(version: SemVer): boolean;
}
}
declare module "semver" {
export = SemVerModule;
}

View file

@ -1,12 +0,0 @@
{
"compilerOptions": {
"noLib": true,
"target": "ES5",
"module": "commonjs",
"outDir": "out",
"sourceMap": true
},
"exclude": [
"node_modules"
]
}

View file

@ -1,13 +0,0 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
declare function run(): void;
declare function suite(name: string, fn: (err?)=>void);
declare function test(name: string, fn: (done?: (err?)=>void)=>void);
declare function suiteSetup(fn: (done?: (err?)=>void)=>void);
declare function suiteTeardown(fn: (done?: (err?)=>void)=>void);
declare function setup(fn: (done?: (err?)=>void)=>void);
declare function teardown(fn: (done?: (err?)=>void)=>void);

View file

@ -14,5 +14,15 @@
"border: ${width} ${border-style} ${color};$0"
],
"description": "[width] [border-style] [color]"
},
"gradient": {
"prefix": "gradient",
"body": [
"background-image: -moz-linear-gradient(top, ${start-color}, ${end-color});",
"background-image: -webkit-gradient(linear, left top, left bottom, from(${start-color}), to(${end-color}));",
"background-image: -webkit-linear-gradient(top, ${start-color}, ${end-color});",
"background-image: linear-gradient(top, ${start-color}, ${end-color});"
],
"description": "Set the 'background-image' property to a linear gradient"
}
}

View file

@ -96,7 +96,7 @@
"patterns": [
{
"name": "comment.block.fsharp",
"begin": "(\\(\\*)",
"begin": "(\\(\\*(?!\\)))",
"end": "(\\*\\))",
"beginCaptures": {
"1": {

View file

@ -0,0 +1,22 @@
// ATTENTION - THIS DIRECTORY CONTAINS THIRD PARTY OPEN SOURCE MATERIALS:
[{
"name": "textmate/html.tmbundle",
"version": "0.0.0",
"license": "TextMate Bundle License",
"repositoryURL": "https://github.com/textmate/html.tmbundle",
"licenseDetail": [
"Copyright (c) textmate-html.tmbundle project authors",
"",
"If not otherwise specified (see below), files in this repository fall under the following license:",
"",
"Permission to copy, use, modify, sell and distribute this",
"software is granted. This software is provided \"as is\" without",
"express or implied warranty, and with no claim as to its",
"suitability for any purpose.",
"",
"An exception is made for files in readable text which contain their own license information,",
"or files where an accompanying file exists (in the same directory) with a \"-license\" suffix added",
"to the base-name name of the original file, and an extension of txt, html, or similar. For example",
"\"tidy\" is accompanied by \"tidy-license.txt\"."
]
}]

View file

@ -2,5 +2,19 @@
"name": "html",
"version": "0.1.0",
"publisher": "vscode",
"engines": { "vscode": "*" }
"engines": { "vscode": "*" },
"contributes": {
"languages": [{
"id": "html",
"extensions": [ ".html", ".htm", ".shtml", ".mdoc", ".jsp", ".asp", ".aspx", ".jshtm" ],
"aliases": [ "HTML", "htm", "html", "xhtml" ],
"mimetypes": ["text/html", "text/x-jshtm", "text/template", "text/ng-template"]
}],
"grammars": [{
/* "language": "html", not yet enabled*/
"scopeName": "text.html.basic",
"path": "./syntaxes/HTML.plist"
}]
}
}

View file

@ -0,0 +1,855 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>fileTypes</key>
<array>
<string>html</string>
<string>htm</string>
<string>shtml</string>
<string>xhtml</string>
<string>inc</string>
<string>tmpl</string>
<string>tpl</string>
</array>
<key>firstLineMatch</key>
<string>&lt;(?i:(!DOCTYPE\s*)?html)</string>
<key>injections</key>
<dict>
<key>R:text.html - comment.block</key>
<dict>
<key>comment</key>
<string>Use R: to ensure this matches after any other injections.</string>
<key>patterns</key>
<array>
<dict>
<key>match</key>
<string>&lt;</string>
<key>name</key>
<string>invalid.illegal.bad-angle-bracket.html</string>
</dict>
</array>
</dict>
</dict>
<key>keyEquivalent</key>
<string>^~H</string>
<key>name</key>
<string>HTML</string>
<key>patterns</key>
<array>
<dict>
<key>begin</key>
<string>(&lt;)([a-zA-Z0-9:]++)(?=[^&gt;]*&gt;&lt;/\2&gt;)</string>
<key>beginCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>punctuation.definition.tag.html</string>
</dict>
<key>2</key>
<dict>
<key>name</key>
<string>entity.name.tag.html</string>
</dict>
</dict>
<key>end</key>
<string>(&gt;(&lt;)/)(\2)(&gt;)</string>
<key>endCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>punctuation.definition.tag.html</string>
</dict>
<key>2</key>
<dict>
<key>name</key>
<string>meta.scope.between-tag-pair.html</string>
</dict>
<key>3</key>
<dict>
<key>name</key>
<string>entity.name.tag.html</string>
</dict>
<key>4</key>
<dict>
<key>name</key>
<string>punctuation.definition.tag.html</string>
</dict>
</dict>
<key>name</key>
<string>meta.tag.any.html</string>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#tag-stuff</string>
</dict>
</array>
</dict>
<dict>
<key>begin</key>
<string>(&lt;\?)(xml)</string>
<key>captures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>punctuation.definition.tag.html</string>
</dict>
<key>2</key>
<dict>
<key>name</key>
<string>entity.name.tag.xml.html</string>
</dict>
</dict>
<key>end</key>
<string>(\?&gt;)</string>
<key>name</key>
<string>meta.tag.preprocessor.xml.html</string>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#tag-generic-attribute</string>
</dict>
<dict>
<key>include</key>
<string>#string-double-quoted</string>
</dict>
<dict>
<key>include</key>
<string>#string-single-quoted</string>
</dict>
</array>
</dict>
<dict>
<key>begin</key>
<string>&lt;!--</string>
<key>captures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>punctuation.definition.comment.html</string>
</dict>
</dict>
<key>end</key>
<string>--\s*&gt;</string>
<key>name</key>
<string>comment.block.html</string>
<key>patterns</key>
<array>
<dict>
<key>match</key>
<string>--</string>
<key>name</key>
<string>invalid.illegal.bad-comments-or-CDATA.html</string>
</dict>
<dict>
<key>include</key>
<string>#embedded-code</string>
</dict>
</array>
</dict>
<dict>
<key>begin</key>
<string>&lt;!</string>
<key>captures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>punctuation.definition.tag.html</string>
</dict>
</dict>
<key>end</key>
<string>&gt;</string>
<key>name</key>
<string>meta.tag.sgml.html</string>
<key>patterns</key>
<array>
<dict>
<key>begin</key>
<string>(?i:DOCTYPE)</string>
<key>captures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>entity.name.tag.doctype.html</string>
</dict>
</dict>
<key>end</key>
<string>(?=&gt;)</string>
<key>name</key>
<string>meta.tag.sgml.doctype.html</string>
<key>patterns</key>
<array>
<dict>
<key>match</key>
<string>"[^"&gt;]*"</string>
<key>name</key>
<string>string.quoted.double.doctype.identifiers-and-DTDs.html</string>
</dict>
</array>
</dict>
<dict>
<key>begin</key>
<string>\[CDATA\[</string>
<key>end</key>
<string>]](?=&gt;)</string>
<key>name</key>
<string>constant.other.inline-data.html</string>
</dict>
<dict>
<key>match</key>
<string>(\s*)(?!--|&gt;)\S(\s*)</string>
<key>name</key>
<string>invalid.illegal.bad-comments-or-CDATA.html</string>
</dict>
</array>
</dict>
<dict>
<key>include</key>
<string>#embedded-code</string>
</dict>
<dict>
<key>begin</key>
<string>(?:^\s+)?(&lt;)((?i:style))\b(?![^&gt;]*/&gt;)</string>
<key>captures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>punctuation.definition.tag.html</string>
</dict>
<key>2</key>
<dict>
<key>name</key>
<string>entity.name.tag.style.html</string>
</dict>
<key>3</key>
<dict>
<key>name</key>
<string>punctuation.definition.tag.html</string>
</dict>
</dict>
<key>end</key>
<string>(&lt;/)((?i:style))(&gt;)(?:\s*\n)?</string>
<key>name</key>
<string>source.css.embedded.html</string>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#tag-stuff</string>
</dict>
<dict>
<key>begin</key>
<string>(&gt;)</string>
<key>beginCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>punctuation.definition.tag.html</string>
</dict>
</dict>
<key>end</key>
<string>(?=&lt;/(?i:style))</string>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#embedded-code</string>
</dict>
<dict>
<key>include</key>
<string>source.css</string>
</dict>
</array>
</dict>
</array>
</dict>
<dict>
<key>begin</key>
<string>(?:^\s+)?(&lt;)((?i:script))\b(?![^&gt;]*/&gt;)(?![^&gt;]*(?i:type.?=.?text/((?!javascript).*)))</string>
<key>beginCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>punctuation.definition.tag.html</string>
</dict>
<key>2</key>
<dict>
<key>name</key>
<string>entity.name.tag.script.html</string>
</dict>
</dict>
<key>end</key>
<string>(?&lt;=&lt;/(script|SCRIPT))(&gt;)(?:\s*\n)?</string>
<key>endCaptures</key>
<dict>
<key>2</key>
<dict>
<key>name</key>
<string>punctuation.definition.tag.html</string>
</dict>
</dict>
<key>name</key>
<string>source.js.embedded.html</string>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#tag-stuff</string>
</dict>
<dict>
<key>begin</key>
<string>(?&lt;!&lt;/(?:script|SCRIPT))(&gt;)</string>
<key>captures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>punctuation.definition.tag.html</string>
</dict>
<key>2</key>
<dict>
<key>name</key>
<string>entity.name.tag.script.html</string>
</dict>
</dict>
<key>end</key>
<string>(&lt;/)((?i:script))</string>
<key>patterns</key>
<array>
<dict>
<key>captures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>punctuation.definition.comment.js</string>
</dict>
</dict>
<key>match</key>
<string>(//).*?((?=&lt;/script)|$\n?)</string>
<key>name</key>
<string>comment.line.double-slash.js</string>
</dict>
<dict>
<key>begin</key>
<string>/\*</string>
<key>captures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>punctuation.definition.comment.js</string>
</dict>
</dict>
<key>end</key>
<string>\*/|(?=&lt;/script)</string>
<key>name</key>
<string>comment.block.js</string>
</dict>
<dict>
<key>include</key>
<string>source.js</string>
</dict>
</array>
</dict>
</array>
</dict>
<dict>
<key>begin</key>
<string>(&lt;/?)((?i:body|head|html)\b)</string>
<key>captures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>punctuation.definition.tag.html</string>
</dict>
<key>2</key>
<dict>
<key>name</key>
<string>entity.name.tag.structure.any.html</string>
</dict>
</dict>
<key>end</key>
<string>(&gt;)</string>
<key>name</key>
<string>meta.tag.structure.any.html</string>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#tag-stuff</string>
</dict>
</array>
</dict>
<dict>
<key>begin</key>
<string>(&lt;/?)((?i:address|blockquote|dd|div|section|article|aside|header|footer|nav|menu|dl|dt|fieldset|form|frame|frameset|h1|h2|h3|h4|h5|h6|iframe|noframes|object|ol|p|ul|applet|center|dir|hr|pre)\b)</string>
<key>beginCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>punctuation.definition.tag.begin.html</string>
</dict>
<key>2</key>
<dict>
<key>name</key>
<string>entity.name.tag.block.any.html</string>
</dict>
</dict>
<key>end</key>
<string>(&gt;)</string>
<key>endCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>punctuation.definition.tag.end.html</string>
</dict>
</dict>
<key>name</key>
<string>meta.tag.block.any.html</string>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#tag-stuff</string>
</dict>
</array>
</dict>
<dict>
<key>begin</key>
<string>(&lt;/?)((?i:a|abbr|acronym|area|b|base|basefont|bdo|big|br|button|caption|cite|code|col|colgroup|del|dfn|em|font|head|html|i|img|input|ins|isindex|kbd|label|legend|li|link|map|meta|noscript|optgroup|option|param|q|s|samp|script|select|small|span|strike|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|title|tr|tt|u|var)\b)</string>
<key>beginCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>punctuation.definition.tag.begin.html</string>
</dict>
<key>2</key>
<dict>
<key>name</key>
<string>entity.name.tag.inline.any.html</string>
</dict>
</dict>
<key>end</key>
<string>((?: ?/)?&gt;)</string>
<key>endCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>punctuation.definition.tag.end.html</string>
</dict>
</dict>
<key>name</key>
<string>meta.tag.inline.any.html</string>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#tag-stuff</string>
</dict>
</array>
</dict>
<dict>
<key>begin</key>
<string>(&lt;/?)([a-zA-Z0-9:]+)</string>
<key>beginCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>punctuation.definition.tag.begin.html</string>
</dict>
<key>2</key>
<dict>
<key>name</key>
<string>entity.name.tag.other.html</string>
</dict>
</dict>
<key>end</key>
<string>(&gt;)</string>
<key>endCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>punctuation.definition.tag.end.html</string>
</dict>
</dict>
<key>name</key>
<string>meta.tag.other.html</string>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#tag-stuff</string>
</dict>
</array>
</dict>
<dict>
<key>include</key>
<string>#entities</string>
</dict>
<dict>
<key>match</key>
<string>&lt;&gt;</string>
<key>name</key>
<string>invalid.illegal.incomplete.html</string>
</dict>
</array>
<key>repository</key>
<dict>
<key>embedded-code</key>
<dict>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#smarty</string>
</dict>
<dict>
<key>include</key>
<string>#python</string>
</dict>
</array>
</dict>
<key>entities</key>
<dict>
<key>patterns</key>
<array>
<dict>
<key>captures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>punctuation.definition.entity.html</string>
</dict>
<key>3</key>
<dict>
<key>name</key>
<string>punctuation.definition.entity.html</string>
</dict>
</dict>
<key>match</key>
<string>(&amp;)([a-zA-Z0-9]+|#[0-9]+|#x[0-9a-fA-F]+)(;)</string>
<key>name</key>
<string>constant.character.entity.html</string>
</dict>
<dict>
<key>match</key>
<string>&amp;</string>
<key>name</key>
<string>invalid.illegal.bad-ampersand.html</string>
</dict>
</array>
</dict>
<key>python</key>
<dict>
<key>begin</key>
<string>(?:^\s*)&lt;\?python(?!.*\?&gt;)</string>
<key>end</key>
<string>\?&gt;(?:\s*$\n)?</string>
<key>name</key>
<string>source.python.embedded.html</string>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>source.python</string>
</dict>
</array>
</dict>
<key>smarty</key>
<dict>
<key>patterns</key>
<array>
<dict>
<key>begin</key>
<string>(\{(literal)\})</string>
<key>captures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>source.smarty.embedded.html</string>
</dict>
<key>2</key>
<dict>
<key>name</key>
<string>support.function.built-in.smarty</string>
</dict>
</dict>
<key>end</key>
<string>(\{/(literal)\})</string>
</dict>
<dict>
<key>begin</key>
<string>{{|{</string>
<key>disabled</key>
<integer>1</integer>
<key>end</key>
<string>}}|}</string>
<key>name</key>
<string>source.smarty.embedded.html</string>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>source.smarty</string>
</dict>
</array>
</dict>
</array>
</dict>
<key>string-double-quoted</key>
<dict>
<key>begin</key>
<string>"</string>
<key>beginCaptures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>punctuation.definition.string.begin.html</string>
</dict>
</dict>
<key>end</key>
<string>"</string>
<key>endCaptures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>punctuation.definition.string.end.html</string>
</dict>
</dict>
<key>name</key>
<string>string.quoted.double.html</string>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#embedded-code</string>
</dict>
<dict>
<key>include</key>
<string>#entities</string>
</dict>
</array>
</dict>
<key>string-single-quoted</key>
<dict>
<key>begin</key>
<string>'</string>
<key>beginCaptures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>punctuation.definition.string.begin.html</string>
</dict>
</dict>
<key>end</key>
<string>'</string>
<key>endCaptures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>punctuation.definition.string.end.html</string>
</dict>
</dict>
<key>name</key>
<string>string.quoted.single.html</string>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#embedded-code</string>
</dict>
<dict>
<key>include</key>
<string>#entities</string>
</dict>
</array>
</dict>
<key>tag-generic-attribute</key>
<dict>
<key>match</key>
<string>(?&lt;=[^=])\b([a-zA-Z0-9:-]+)</string>
<key>name</key>
<string>entity.other.attribute-name.html</string>
</dict>
<key>tag-id-attribute</key>
<dict>
<key>begin</key>
<string>\b(id)\b\s*(=)</string>
<key>captures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>entity.other.attribute-name.id.html</string>
</dict>
<key>2</key>
<dict>
<key>name</key>
<string>punctuation.separator.key-value.html</string>
</dict>
</dict>
<key>end</key>
<string>(?!\G)(?&lt;='|"|[^\s&lt;&gt;/])</string>
<key>name</key>
<string>meta.attribute-with-value.id.html</string>
<key>patterns</key>
<array>
<dict>
<key>begin</key>
<string>"</string>
<key>beginCaptures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>punctuation.definition.string.begin.html</string>
</dict>
</dict>
<key>contentName</key>
<string>meta.toc-list.id.html</string>
<key>end</key>
<string>"</string>
<key>endCaptures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>punctuation.definition.string.end.html</string>
</dict>
</dict>
<key>name</key>
<string>string.quoted.double.html</string>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#embedded-code</string>
</dict>
<dict>
<key>include</key>
<string>#entities</string>
</dict>
</array>
</dict>
<dict>
<key>begin</key>
<string>'</string>
<key>beginCaptures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>punctuation.definition.string.begin.html</string>
</dict>
</dict>
<key>contentName</key>
<string>meta.toc-list.id.html</string>
<key>end</key>
<string>'</string>
<key>endCaptures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>punctuation.definition.string.end.html</string>
</dict>
</dict>
<key>name</key>
<string>string.quoted.single.html</string>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#embedded-code</string>
</dict>
<dict>
<key>include</key>
<string>#entities</string>
</dict>
</array>
</dict>
<dict>
<key>captures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>meta.toc-list.id.html</string>
</dict>
</dict>
<key>match</key>
<string>(?&lt;==)(?:[^\s&lt;&gt;/'"]|/(?!&gt;))+</string>
<key>name</key>
<string>string.unquoted.html</string>
</dict>
</array>
</dict>
<key>tag-stuff</key>
<dict>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#tag-id-attribute</string>
</dict>
<dict>
<key>include</key>
<string>#tag-generic-attribute</string>
</dict>
<dict>
<key>include</key>
<string>#string-double-quoted</string>
</dict>
<dict>
<key>include</key>
<string>#string-single-quoted</string>
</dict>
<dict>
<key>include</key>
<string>#embedded-code</string>
</dict>
<dict>
<key>include</key>
<string>#unquoted-attribute</string>
</dict>
</array>
</dict>
<key>unquoted-attribute</key>
<dict>
<key>match</key>
<string>(?&lt;==)(?:[^\s&lt;&gt;/'"]|/(?!&gt;))+</string>
<key>name</key>
<string>string.unquoted.html</string>
</dict>
</dict>
<key>scopeName</key>
<string>text.html.basic</string>
<key>uuid</key>
<string>17994EC8-6B1D-11D9-AC3A-000D93589AF6</string>
</dict>
</plist>

View file

@ -1,11 +1,11 @@
// ATTENTION - THIS DIRECTORY CONTAINS THIRD PARTY OPEN SOURCE MATERIALS:
[{
"name": "typescript-sublime-plugin",
"version": "0.1.8",
"name": "Microsoft/TypeScript-TmLanguage",
"version": "0.0.1",
"license": "Apache2",
"repositoryURL": "https://github.com/Microsoft/TypeScript-Sublime-Plugin",
"description": "The file syntaxes/JavaScriptReact.tmLanguage was derived from the TypeScript-Sublime-Plugin https://github.com/Microsoft/TypeScript-Sublime-Plugin.",
"repositoryURL": "https://github.com/Microsoft/TypeScript-TmLanguage",
"description": "The files syntaxes/JavaScriptReact.tmLanguage & syntaxes/JavaScript.tmLanguage were derived from TypeScript-TmLanguage https://github.com/Microsoft/TypeScript-TmLanguage.",
"licenseDetail": [
// Reason: LICENSE file does not include Copyright statement
"Copyright (c) Microsoft Corporation. All rights reserved.",

View file

@ -0,0 +1,11 @@
{
"comments": {
"lineComment": "//",
"blockComment": [ "/*", "*/" ]
},
"brackets": [
["{", "}"],
["[", "]"],
["(", ")"]
]
}

View file

@ -7,9 +7,9 @@
"languages": [{
"id": "javascriptreact",
"aliases": ["JavaScript React","jsx"],
"extensions": [".jsx"]
},
{
"extensions": [".jsx"],
"configuration": "./javascript.configuration.json"
},{
"id": "javascript",
"aliases": ["JavaScript", "javascript", "js"],
"extensions": [".js", ".es6"],
@ -26,6 +26,7 @@
"scopeName": "source.js",
"path": "./syntaxes/JavaScript.tmLanguage"
},{
// referenced by other grammars
"scopeName": "source.js.regexp",
"path": "./syntaxes/Regular Expressions (JavaScript).tmLanguage"
}],

File diff suppressed because it is too large Load diff

View file

@ -3,3 +3,10 @@ The JavaScriptReact.tmLanguage bundle is derived from the TypeScriptReact.tmLang
Changes:
- fileTypes -> .jsx
- scopeName -> scope.jsx
The JavaScript-ts.tmLanguage bundle is derived from the TypeScriptReact.tmLanguage.
Changes:
- all occurences of .ts -> .js
- fileTypes -> .js
- scopeName -> scope.js

View file

@ -0,0 +1,7 @@
// ATTENTION - THIS DIRECTORY CONTAINS THIRD PARTY OPEN SOURCE MATERIALS:
[{
"name": "Benvie/JavaScriptNext.tmLanguage",
"version": "0.0.0",
"license": "MIT",
"repositoryURL": "https://github.com/Benvie/JavaScriptNext.tmLanguage"
}]

View file

@ -0,0 +1,19 @@
{
"name": "json",
"version": "0.1.0",
"publisher": "vscode",
"engines": { "vscode": "*" },
"contributes": {
"languages": [{
"id": "json",
"aliases": ["JSON", "json"],
"extensions": [".json", ".bowerrc", ".jshintrc", ".jscsrc", ".eslintrc"],
"mimetypes": ["application/json"]
}],
"grammars": [{
"language": "json",
"scopeName": "source.json",
"path": "./syntaxes/JSON.tmLanguage"
}]
}
}

View file

@ -0,0 +1,387 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>fileTypes</key>
<array>
<string>json</string>
<string>sublime-settings</string>
<string>sublime-menu</string>
<string>sublime-keymap</string>
<string>sublime-mousemap</string>
<string>sublime-theme</string>
<string>sublime-build</string>
<string>sublime-project</string>
<string>sublime-completions</string>
</array>
<key>foldingStartMarker</key>
<string>(?x) # turn on extended mode
^ # a line beginning with
\s* # some optional space
[{\[] # the start of an object or array
(?! # but not followed by
.* # whatever
[}\]] # and the close of an object or array
,? # an optional comma
\s* # some optional space
$ # at the end of the line
)
| # ...or...
[{\[] # the start of an object or array
\s* # some optional space
$ # at the end of the line</string>
<key>foldingStopMarker</key>
<string>(?x) # turn on extended mode
^ # a line beginning with
\s* # some optional space
[}\]] # and the close of an object or array</string>
<key>keyEquivalent</key>
<string>^~J</string>
<key>name</key>
<string>JSON (Javascript Next)</string>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#value</string>
</dict>
</array>
<key>repository</key>
<dict>
<key>array</key>
<dict>
<key>begin</key>
<string>\[</string>
<key>beginCaptures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>punctuation.definition.array.begin.json</string>
</dict>
</dict>
<key>end</key>
<string>\]</string>
<key>endCaptures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>punctuation.definition.array.end.json</string>
</dict>
</dict>
<key>name</key>
<string>meta.structure.array.json</string>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#value</string>
</dict>
<dict>
<key>match</key>
<string>,</string>
<key>name</key>
<string>punctuation.separator.array.json</string>
</dict>
<dict>
<key>match</key>
<string>[^\s\]]</string>
<key>name</key>
<string>invalid.illegal.expected-array-separator.json</string>
</dict>
</array>
</dict>
<key>comments</key>
<dict>
<key>patterns</key>
<array>
<dict>
<key>begin</key>
<string>/\*\*</string>
<key>captures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>punctuation.definition.comment.json</string>
</dict>
</dict>
<key>end</key>
<string>\*/</string>
<key>name</key>
<string>comment.block.documentation.json</string>
</dict>
<dict>
<key>begin</key>
<string>/\*</string>
<key>captures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>punctuation.definition.comment.json</string>
</dict>
</dict>
<key>end</key>
<string>\*/</string>
<key>name</key>
<string>comment.block.json</string>
</dict>
<dict>
<key>captures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>punctuation.definition.comment.json</string>
</dict>
</dict>
<key>match</key>
<string>(//).*$\n?</string>
<key>name</key>
<string>comment.line.double-slash.js</string>
</dict>
</array>
</dict>
<key>constant</key>
<dict>
<key>match</key>
<string>\b(?:true|false|null)\b</string>
<key>name</key>
<string>constant.language.json</string>
</dict>
<key>number</key>
<dict>
<key>match</key>
<string>(?x) # turn on extended mode
-? # an optional minus
(?:
0 # a zero
| # ...or...
[1-9] # a 1-9 character
\d* # followed by zero or more digits
)
(?:
(?:
\. # a period
\d+ # followed by one or more digits
)?
(?:
[eE] # an e character
[+-]? # followed by an option +/-
\d+ # followed by one or more digits
)? # make exponent optional
)? # make decimal portion optional</string>
<key>name</key>
<string>constant.numeric.json</string>
</dict>
<key>object</key>
<dict>
<key>begin</key>
<string>\{</string>
<key>beginCaptures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>punctuation.definition.dictionary.begin.json</string>
</dict>
</dict>
<key>end</key>
<string>\}</string>
<key>endCaptures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>punctuation.definition.dictionary.end.json</string>
</dict>
</dict>
<key>name</key>
<string>meta.structure.dictionary.json</string>
<key>patterns</key>
<array>
<dict>
<key>comment</key>
<string>the JSON object key</string>
<key>include</key>
<string>#objectkey</string>
</dict>
<dict>
<key>include</key>
<string>#comments</string>
</dict>
<dict>
<key>begin</key>
<string>:</string>
<key>beginCaptures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>punctuation.separator.dictionary.key-value.json</string>
</dict>
</dict>
<key>end</key>
<string>(,)|(?=\})</string>
<key>endCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>punctuation.separator.dictionary.pair.json</string>
</dict>
</dict>
<key>name</key>
<string>meta.structure.dictionary.value.json</string>
<key>patterns</key>
<array>
<dict>
<key>comment</key>
<string>the JSON object value</string>
<key>include</key>
<string>#value</string>
</dict>
<dict>
<key>match</key>
<string>[^\s,]</string>
<key>name</key>
<string>invalid.illegal.expected-dictionary-separator.json</string>
</dict>
</array>
</dict>
<dict>
<key>match</key>
<string>[^\s\}]</string>
<key>name</key>
<string>invalid.illegal.expected-dictionary-separator.json</string>
</dict>
</array>
</dict>
<key>string</key>
<dict>
<key>begin</key>
<string>"</string>
<key>beginCaptures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>punctuation.definition.string.begin.json</string>
</dict>
</dict>
<key>end</key>
<string>"</string>
<key>endCaptures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>punctuation.definition.string.end.json</string>
</dict>
</dict>
<key>name</key>
<string>string.quoted.double.json</string>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#stringcontent</string>
</dict>
</array>
</dict>
<key>objectkey</key>
<dict>
<key>begin</key>
<string>"</string>
<key>beginCaptures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>punctuation.support.type.property-name.begin.json</string>
</dict>
</dict>
<key>end</key>
<string>"</string>
<key>endCaptures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>punctuation.support.type.property-name.end.json</string>
</dict>
</dict>
<key>name</key>
<string>support.type.property-name.json</string>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#stringcontent</string>
</dict>
</array>
</dict>
<key>stringcontent</key>
<dict>
<key>patterns</key>
<array>
<dict>
<key>match</key>
<string>(?x) # turn on extended mode
\\ # a literal backslash
(?: # ...followed by...
["\\/bfnrt] # one of these characters
| # ...or...
u # a u
[0-9a-fA-F]{4}) # and four hex digits</string>
<key>name</key>
<string>constant.character.escape.json</string>
</dict>
<dict>
<key>match</key>
<string>\\.</string>
<key>name</key>
<string>invalid.illegal.unrecognized-string-escape.json</string>
</dict>
</array>
</dict>
<key>value</key>
<dict>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#constant</string>
</dict>
<dict>
<key>include</key>
<string>#number</string>
</dict>
<dict>
<key>include</key>
<string>#string</string>
</dict>
<dict>
<key>include</key>
<string>#array</string>
</dict>
<dict>
<key>include</key>
<string>#object</string>
</dict>
<dict>
<key>include</key>
<string>#comments</string>
</dict>
</array>
</dict>
</dict>
<key>scopeName</key>
<string>source.json</string>
<key>uuid</key>
<string>8f97457b-516e-48ce-83c7-08ae12fb327a</string>
</dict>
</plist>

View file

@ -243,7 +243,7 @@
</dict>
<dict>
<key>match</key>
<string>\b(break|do|else|for|if|elseif|return|then|repeat|while|until|end|function|local|in)\b</string>
<string>\b(break|do|else|for|if|elseif|goto|return|then|repeat|while|until|end|function|local|in)\b</string>
<key>name</key>
<string>keyword.control.lua</string>
</dict>

View file

@ -1,6 +1,6 @@
{
"account": "monacobuild",
"container": "debuggers",
"zip": "757615d/mono-debug.zip",
"zip": "090c7d9/mono-debug.zip",
"output": ""
}

View file

@ -1,6 +1,6 @@
{
"account": "monacobuild",
"container": "debuggers",
"zip": "a7f6203/node-debug.zip",
"zip": "32575e3/node-debug.zip",
"output": ""
}

View file

@ -21,6 +21,11 @@
"title": "PHP Configuration options",
"type": "object",
"properties": {
"php.validate.enable": {
"type": "boolean",
"default": true,
"description": "Whether php validation is enabled or not."
},
"php.validate.executablePath": {
"type": "string",
"default": null,

View file

@ -61,7 +61,17 @@ export default class PHPCompletionItemProvider implements CompletionItemProvider
while (match = variableMatch.exec(text)) {
var word = match[0];
if (!added[word]) {
result.push(createNewProposal(CompletionItemKind.Variable, name, null));
added[word] = true;
result.push(createNewProposal(CompletionItemKind.Variable, word, null));
}
}
var functionMatch = /function\s+([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\s*\(/g;
var match : RegExpExecArray = null;
while (match = functionMatch.exec(text)) {
var word = match[1];
if (!added[word]) {
added[word] = true;
result.push(createNewProposal(CompletionItemKind.Function, word, null));
}
}
return Promise.resolve(result);

View file

@ -84,6 +84,7 @@ export default class PHPValidationProvider {
private static BufferArgs: string[] = ['-l', '-n', '-d', 'display_errors=On', '-d', 'log_errors=Off'];
private static FileArgs: string[] = ['-l', '-n', '-d', 'display_errors=On', '-d', 'log_errors=Off', '-f'];
private validationEnabled: boolean;
private executable: string;
private trigger: RunTrigger;
private executableNotFound: boolean;
@ -94,6 +95,7 @@ export default class PHPValidationProvider {
constructor() {
this.executable = null;
this.validationEnabled = true;
this.trigger = RunTrigger.onSave;
this.executableNotFound = false;
}
@ -109,9 +111,6 @@ export default class PHPValidationProvider {
this.diagnosticCollection.delete(textDocument.uri);
delete this.delayers[textDocument.uri.toString()];
}, null, subscriptions);
// Validate all open php documents
vscode.workspace.textDocuments.forEach(this.triggerValidate, this);
}
public dispose(): void {
@ -123,6 +122,7 @@ export default class PHPValidationProvider {
let section = vscode.workspace.getConfiguration('php');
let oldExecutable = this.executable;
if (section) {
this.validationEnabled = section.get<boolean>('validate.enable', true);
this.executable = section.get<string>('validate.executablePath', null);
this.trigger = RunTrigger.from(section.get<string>('validate.run', RunTrigger.strings.onSave));
}
@ -133,26 +133,29 @@ export default class PHPValidationProvider {
if (this.documentListener) {
this.documentListener.dispose();
}
if (this.trigger === RunTrigger.onType) {
this.documentListener = vscode.workspace.onDidChangeTextDocument((e) => {
this.triggerValidate(e.document);
});
} else {
this.documentListener = vscode.workspace.onDidSaveTextDocument(this.triggerValidate, this);
this.diagnosticCollection.clear();
if (this.validationEnabled) {
if (this.trigger === RunTrigger.onType) {
this.documentListener = vscode.workspace.onDidChangeTextDocument((e) => {
this.triggerValidate(e.document);
});
} else {
this.documentListener = vscode.workspace.onDidSaveTextDocument(this.triggerValidate, this);
}
// Configuration has changed. Reevaluate all documents.
vscode.workspace.textDocuments.forEach(this.triggerValidate, this);
}
// Configuration has changed. Reevaluate all documents.
vscode.workspace.textDocuments.forEach(this.triggerValidate, this);
}
private triggerValidate(textDocument: vscode.TextDocument): void {
if (textDocument.languageId !== 'php' || this.executableNotFound) {
if (textDocument.languageId !== 'php' || this.executableNotFound || !this.validationEnabled) {
return;
}
let key = textDocument.uri.toString();
let delayer = this.delayers[key];
if (!delayer) {
delayer = new ThrottledDelayer<void>(this.trigger === RunTrigger.onType ? 250 : 0);
this.delayers[key];
this.delayers[key] = delayer;
}
delayer.trigger(() => this.doValidate(textDocument) );
}

View file

@ -1,5 +1,5 @@
import assert = require('assert');
import {CompletionItemProvider, CompletionItem, CompletionItemKind, CancellationToken, TextDocument, Range, Position, Uri} from 'vscode';
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';
@ -7,14 +7,19 @@ import SignatureHelpProvider from '../features/signatureHelpProvider';
var phpCompletionProvider = new PHPCompletionItemProvider();
var testSuggestionsFor = function(value:string, stringBefore:string):Promise<CompletionItem[]> {
var uri = new Uri();
var doc = new TextDocument(uri, value.split('\n'), '\n', 'php', 1, false);
var idx = stringBefore ? value.indexOf(stringBefore) + stringBefore.length : 0;
var position = new Position(0, idx);
return phpCompletionProvider.provideCompletionItems(doc, position, null);
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) {
@ -25,9 +30,9 @@ var assertSuggestion= function(completions:CompletionItem[], label:string, kind:
assert.equal(entries[0].kind, kind);
};
suite("Extension Tests", () => {
suite("PHP", () => {
test("Something 1", (testDone:(err?:any) => void) => {
test("Intellisense", (testDone:(err?:any) => void) => {
Promise.all([
testSuggestionsFor('<?php ', 'php ').then(completions => {
assertSuggestion(completions, '__CLASS__', CompletionItemKind.Field);

View file

@ -6,7 +6,7 @@
"contributes": {
"languages": [{
"id": "python",
"extensions": [ ".py", ".rpy", ".pyw", ".cpy", ".gyp", ".gypi" ],
"extensions": [ ".py", ".rpy", ".pyw", ".cpy", ".gn", ".gyp", ".gypi" ],
"aliases": [ "Python", "py" ],
"firstLine": "^#!/.*\\bpython[0-9.-]*\\b",
"configuration": "./python.configuration.json"

View file

@ -7,7 +7,7 @@
"languages": [{
"id": "ruby",
"extensions": [ ".rb", ".rbx", ".rjs", ".gemspec", ".pp" ],
"filenames": [ "rakefile" ],
"filenames": [ "rakefile", "gemfile" ],
"aliases": [ "Ruby", "rb" ],
"configuration": "./ruby.configuration.json"
}],

View file

@ -6,7 +6,7 @@
"contributes": {
"languages": [{
"id": "shaderlab",
"extensions": [".shader"],
"extensions": [".shader", ".cginc"],
"aliases": ["ShaderLab", "shaderlab"],
"configuration": "./shaderlab.configuration.json"
}],

View file

@ -11,6 +11,6 @@
"typescript/src/lib",
"typescript/out/lib",
"jshint",
"csharp-o"
"vscode-api-tests/node_modules"
]
}

View file

@ -3965,7 +3965,34 @@ interface ObjectConstructor {
* Copy the values of all of the enumerable own properties from one or more source objects to a
* target object. Returns the target object.
* @param target The target object to copy to.
* @param sources One or more source objects to copy properties from.
* @param source The source object from which to copy properties.
*/
assign<T, U>(target: T, source: U): T & U;
/**
* Copy the values of all of the enumerable own properties from one or more source objects to a
* target object. Returns the target object.
* @param target The target object to copy to.
* @param source1 The first source object from which to copy properties.
* @param source2 The second source object from which to copy properties.
*/
assign<T, U, V>(target: T, source1: U, source2: V): T & U & V;
/**
* Copy the values of all of the enumerable own properties from one or more source objects to a
* target object. Returns the target object.
* @param target The target object to copy to.
* @param source1 The first source object from which to copy properties.
* @param source2 The second source object from which to copy properties.
* @param source3 The third source object from which to copy properties.
*/
assign<T, U, V, W>(target: T, source1: U, source2: V, source3: W): T & U & V & W;
/**
* Copy the values of all of the enumerable own properties from one or more source objects to a
* target object. Returns the target object.
* @param target The target object to copy to.
* @param sources One or more source objects from which to copy properties
*/
assign(target: any, ...sources: any[]): any;

View file

@ -3881,7 +3881,7 @@ declare module Intl {
currency?: string;
currencyDisplay?: string;
useGrouping?: boolean;
minimumintegerDigits?: number;
minimumIntegerDigits?: number;
minimumFractionDigits?: number;
maximumFractionDigits?: number;
minimumSignificantDigits?: number;
@ -3894,7 +3894,7 @@ declare module Intl {
style: string;
currency?: string;
currencyDisplay?: string;
minimumintegerDigits: number;
minimumIntegerDigits: number;
minimumFractionDigits: number;
maximumFractionDigits: number;
minimumSignificantDigits?: number;
@ -4243,8 +4243,8 @@ interface AnalyserNode extends AudioNode {
smoothingTimeConstant: number;
getByteFrequencyData(array: Uint8Array): void;
getByteTimeDomainData(array: Uint8Array): void;
getFloatFrequencyData(array: any): void;
getFloatTimeDomainData(array: any): void;
getFloatFrequencyData(array: Float32Array): void;
getFloatTimeDomainData(array: Float32Array): void;
}
declare var AnalyserNode: {
@ -4331,7 +4331,7 @@ interface AudioBuffer {
length: number;
numberOfChannels: number;
sampleRate: number;
getChannelData(channel: number): any;
getChannelData(channel: number): Float32Array;
}
declare var AudioBuffer: {
@ -4375,7 +4375,7 @@ interface AudioContext extends EventTarget {
createMediaElementSource(mediaElement: HTMLMediaElement): MediaElementAudioSourceNode;
createOscillator(): OscillatorNode;
createPanner(): PannerNode;
createPeriodicWave(real: any, imag: any): PeriodicWave;
createPeriodicWave(real: Float32Array, imag: Float32Array): PeriodicWave;
createScriptProcessor(bufferSize?: number, numberOfInputChannels?: number, numberOfOutputChannels?: number): ScriptProcessorNode;
createStereoPanner(): StereoPannerNode;
createWaveShaper(): WaveShaperNode;
@ -4433,7 +4433,7 @@ interface AudioParam {
linearRampToValueAtTime(value: number, endTime: number): void;
setTargetAtTime(target: number, startTime: number, timeConstant: number): void;
setValueAtTime(value: number, startTime: number): void;
setValueCurveAtTime(values: any, startTime: number, duration: number): void;
setValueCurveAtTime(values: Float32Array, startTime: number, duration: number): void;
}
declare var AudioParam: {
@ -4509,7 +4509,7 @@ interface BiquadFilterNode extends AudioNode {
frequency: AudioParam;
gain: AudioParam;
type: string;
getFrequencyResponse(frequencyHz: any, magResponse: any, phaseResponse: any): void;
getFrequencyResponse(frequencyHz: Float32Array, magResponse: Float32Array, phaseResponse: Float32Array): void;
}
declare var BiquadFilterNode: {
@ -5108,7 +5108,7 @@ declare var CanvasPattern: {
interface CanvasRenderingContext2D {
canvas: HTMLCanvasElement;
fillStyle: any;
fillStyle: string | CanvasGradient | CanvasPattern;
font: string;
globalAlpha: number;
globalCompositeOperation: string;
@ -5123,7 +5123,7 @@ interface CanvasRenderingContext2D {
shadowColor: string;
shadowOffsetX: number;
shadowOffsetY: number;
strokeStyle: any;
strokeStyle: string | CanvasGradient | CanvasPattern;
textAlign: string;
textBaseline: string;
arc(x: number, y: number, radius: number, startAngle: number, endAngle: number, anticlockwise?: boolean): void;
@ -6491,8 +6491,6 @@ interface Document extends Node, GlobalEventHandlers, NodeSelector, DocumentEven
importNode(importedNode: Node, deep: boolean): Node;
msElementsFromPoint(x: number, y: number): NodeList;
msElementsFromRect(left: number, top: number, width: number, height: number): NodeList;
msGetPrintDocumentForNamedFlow(flowName: string): Document;
msSetPrintDocumentUriForNamedFlow(flowName: string, uri: string): void;
/**
* Opens a new window and loads a document specified by a given URL. Also, opens a new window that uses the url parameter and the name parameter to collect the output of the write method and the writeln method.
* @param url Specifies a MIME type for the document.
@ -11314,27 +11312,6 @@ declare var MSHTMLWebViewElement: {
new(): MSHTMLWebViewElement;
}
interface MSHeaderFooter {
URL: string;
dateLong: string;
dateShort: string;
font: string;
htmlFoot: string;
htmlHead: string;
page: number;
pageTotal: number;
textFoot: string;
textHead: string;
timeLong: string;
timeShort: string;
title: string;
}
declare var MSHeaderFooter: {
prototype: MSHeaderFooter;
new(): MSHeaderFooter;
}
interface MSInputMethodContext extends EventTarget {
compositionEndOffset: number;
compositionStartOffset: number;
@ -11493,24 +11470,6 @@ declare var MSPointerEvent: {
new(typeArg: string, eventInitDict?: PointerEventInit): MSPointerEvent;
}
interface MSPrintManagerTemplatePrinter extends MSTemplatePrinter, EventTarget {
percentScale: number;
showHeaderFooter: boolean;
shrinkToFit: boolean;
drawPreviewPage(element: HTMLElement, pageNumber: number): void;
endPrint(): void;
getPrintTaskOptionValue(key: string): any;
invalidatePreview(): void;
setPageCount(pageCount: number): void;
startPrint(): void;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var MSPrintManagerTemplatePrinter: {
prototype: MSPrintManagerTemplatePrinter;
new(): MSPrintManagerTemplatePrinter;
}
interface MSRangeCollection {
length: number;
item(index: number): Range;
@ -11558,63 +11517,6 @@ declare var MSStreamReader: {
new(): MSStreamReader;
}
interface MSTemplatePrinter {
collate: boolean;
copies: number;
currentPage: boolean;
currentPageAvail: boolean;
duplex: boolean;
footer: string;
frameActive: boolean;
frameActiveEnabled: boolean;
frameAsShown: boolean;
framesetDocument: boolean;
header: string;
headerFooterFont: string;
marginBottom: number;
marginLeft: number;
marginRight: number;
marginTop: number;
orientation: string;
pageFrom: number;
pageHeight: number;
pageTo: number;
pageWidth: number;
selectedPages: boolean;
selection: boolean;
selectionEnabled: boolean;
unprintableBottom: number;
unprintableLeft: number;
unprintableRight: number;
unprintableTop: number;
usePrinterCopyCollate: boolean;
createHeaderFooter(): MSHeaderFooter;
deviceSupports(property: string): any;
ensurePrintDialogDefaults(): boolean;
getPageMarginBottom(pageRule: CSSPageRule, pageWidth: number, pageHeight: number): any;
getPageMarginBottomImportant(pageRule: CSSPageRule): boolean;
getPageMarginLeft(pageRule: CSSPageRule, pageWidth: number, pageHeight: number): any;
getPageMarginLeftImportant(pageRule: CSSPageRule): boolean;
getPageMarginRight(pageRule: CSSPageRule, pageWidth: number, pageHeight: number): any;
getPageMarginRightImportant(pageRule: CSSPageRule): boolean;
getPageMarginTop(pageRule: CSSPageRule, pageWidth: number, pageHeight: number): any;
getPageMarginTopImportant(pageRule: CSSPageRule): boolean;
printBlankPage(): void;
printNonNative(document: any): boolean;
printNonNativeFrames(document: any, activeFrame: boolean): void;
printPage(element: HTMLElement): void;
showPageSetupDialog(): boolean;
showPrintDialog(): boolean;
startDoc(title: string): boolean;
stopDoc(): void;
updatePageStatus(status: number): void;
}
declare var MSTemplatePrinter: {
prototype: MSTemplatePrinter;
new(): MSTemplatePrinter;
}
interface MSWebViewAsyncOperation extends EventTarget {
error: DOMError;
oncomplete: (ev: Event) => any;
@ -12032,6 +11934,10 @@ declare var Node: {
}
interface NodeFilter {
acceptNode(n: Node): number;
}
declare var NodeFilter: {
FILTER_ACCEPT: number;
FILTER_REJECT: number;
FILTER_SKIP: number;
@ -12049,7 +11955,6 @@ interface NodeFilter {
SHOW_PROCESSING_INSTRUCTION: number;
SHOW_TEXT: number;
}
declare var NodeFilter: NodeFilter;
interface NodeIterator {
expandEntityReferences: boolean;
@ -12759,7 +12664,6 @@ declare var SVGDescElement: {
interface SVGElement extends Element {
id: string;
className: any;
onclick: (ev: MouseEvent) => any;
ondblclick: (ev: MouseEvent) => any;
onfocusin: (ev: FocusEvent) => any;
@ -12773,6 +12677,7 @@ interface SVGElement extends Element {
ownerSVGElement: SVGSVGElement;
viewportElement: SVGElement;
xmlbase: string;
className: any;
addEventListener(type: "MSGestureChange", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureDoubleTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureEnd", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
@ -14934,7 +14839,7 @@ declare var WEBGL_depth_texture: {
}
interface WaveShaperNode extends AudioNode {
curve: any;
curve: Float32Array;
oversample: string;
}
@ -15121,34 +15026,34 @@ interface WebGLRenderingContext {
texSubImage2D(target: number, level: number, xoffset: number, yoffset: number, format: number, type: number, video: HTMLVideoElement): void;
texSubImage2D(target: number, level: number, xoffset: number, yoffset: number, format: number, type: number, pixels: ImageData): void;
uniform1f(location: WebGLUniformLocation, x: number): void;
uniform1fv(location: WebGLUniformLocation, v: any): void;
uniform1fv(location: WebGLUniformLocation, v: Float32Array): void;
uniform1i(location: WebGLUniformLocation, x: number): void;
uniform1iv(location: WebGLUniformLocation, v: Int32Array): void;
uniform2f(location: WebGLUniformLocation, x: number, y: number): void;
uniform2fv(location: WebGLUniformLocation, v: any): void;
uniform2fv(location: WebGLUniformLocation, v: Float32Array): void;
uniform2i(location: WebGLUniformLocation, x: number, y: number): void;
uniform2iv(location: WebGLUniformLocation, v: Int32Array): void;
uniform3f(location: WebGLUniformLocation, x: number, y: number, z: number): void;
uniform3fv(location: WebGLUniformLocation, v: any): void;
uniform3fv(location: WebGLUniformLocation, v: Float32Array): void;
uniform3i(location: WebGLUniformLocation, x: number, y: number, z: number): void;
uniform3iv(location: WebGLUniformLocation, v: Int32Array): void;
uniform4f(location: WebGLUniformLocation, x: number, y: number, z: number, w: number): void;
uniform4fv(location: WebGLUniformLocation, v: any): void;
uniform4fv(location: WebGLUniformLocation, v: Float32Array): void;
uniform4i(location: WebGLUniformLocation, x: number, y: number, z: number, w: number): void;
uniform4iv(location: WebGLUniformLocation, v: Int32Array): void;
uniformMatrix2fv(location: WebGLUniformLocation, transpose: boolean, value: any): void;
uniformMatrix3fv(location: WebGLUniformLocation, transpose: boolean, value: any): void;
uniformMatrix4fv(location: WebGLUniformLocation, transpose: boolean, value: any): void;
uniformMatrix2fv(location: WebGLUniformLocation, transpose: boolean, value: Float32Array): void;
uniformMatrix3fv(location: WebGLUniformLocation, transpose: boolean, value: Float32Array): void;
uniformMatrix4fv(location: WebGLUniformLocation, transpose: boolean, value: Float32Array): void;
useProgram(program: WebGLProgram): void;
validateProgram(program: WebGLProgram): void;
vertexAttrib1f(indx: number, x: number): void;
vertexAttrib1fv(indx: number, values: any): void;
vertexAttrib1fv(indx: number, values: Float32Array): void;
vertexAttrib2f(indx: number, x: number, y: number): void;
vertexAttrib2fv(indx: number, values: any): void;
vertexAttrib2fv(indx: number, values: Float32Array): void;
vertexAttrib3f(indx: number, x: number, y: number, z: number): void;
vertexAttrib3fv(indx: number, values: any): void;
vertexAttrib3fv(indx: number, values: Float32Array): void;
vertexAttrib4f(indx: number, x: number, y: number, z: number, w: number): void;
vertexAttrib4fv(indx: number, values: any): void;
vertexAttrib4fv(indx: number, values: Float32Array): void;
vertexAttribPointer(indx: number, size: number, type: number, normalized: boolean, stride: number, offset: number): void;
viewport(x: number, y: number, width: number, height: number): void;
ACTIVE_ATTRIBUTES: number;
@ -15912,7 +15817,6 @@ interface Window extends EventTarget, WindowTimers, WindowSessionStorage, Window
locationbar: BarProp;
menubar: BarProp;
msAnimationStartTime: number;
msTemplatePrinter: MSTemplatePrinter;
name: string;
navigator: Navigator;
offscreenBuffering: string | boolean;
@ -16649,7 +16553,6 @@ interface XMLHttpRequestEventTarget {
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
interface NodeListOf<TNode extends Node> extends NodeList {
length: number;
item(index: number): TNode;
@ -16670,8 +16573,6 @@ interface EventListenerObject {
handleEvent(evt: Event): void;
}
declare type EventListenerOrEventListenerObject = EventListener | EventListenerObject;
interface MessageEventInit extends EventInit {
data?: any;
origin?: string;
@ -16687,6 +16588,8 @@ interface ProgressEventInit extends EventInit {
total?: number;
}
declare type EventListenerOrEventListenerObject = EventListener | EventListenerObject;
interface ErrorEventHandler {
(message: string, filename?: string, lineno?: number, colno?: number, error?:Error): void;
}
@ -16747,7 +16650,6 @@ declare var location: Location;
declare var locationbar: BarProp;
declare var menubar: BarProp;
declare var msAnimationStartTime: number;
declare var msTemplatePrinter: MSTemplatePrinter;
declare var name: string;
declare var navigator: Navigator;
declare var offscreenBuffering: string | boolean;

View file

@ -57,7 +57,7 @@ declare module Intl {
currency?: string;
currencyDisplay?: string;
useGrouping?: boolean;
minimumintegerDigits?: number;
minimumIntegerDigits?: number;
minimumFractionDigits?: number;
maximumFractionDigits?: number;
minimumSignificantDigits?: number;
@ -70,7 +70,7 @@ declare module Intl {
style: string;
currency?: string;
currencyDisplay?: string;
minimumintegerDigits: number;
minimumIntegerDigits: number;
minimumFractionDigits: number;
maximumFractionDigits: number;
minimumSignificantDigits?: number;
@ -419,8 +419,8 @@ interface AnalyserNode extends AudioNode {
smoothingTimeConstant: number;
getByteFrequencyData(array: Uint8Array): void;
getByteTimeDomainData(array: Uint8Array): void;
getFloatFrequencyData(array: any): void;
getFloatTimeDomainData(array: any): void;
getFloatFrequencyData(array: Float32Array): void;
getFloatTimeDomainData(array: Float32Array): void;
}
declare var AnalyserNode: {
@ -507,7 +507,7 @@ interface AudioBuffer {
length: number;
numberOfChannels: number;
sampleRate: number;
getChannelData(channel: number): any;
getChannelData(channel: number): Float32Array;
}
declare var AudioBuffer: {
@ -551,7 +551,7 @@ interface AudioContext extends EventTarget {
createMediaElementSource(mediaElement: HTMLMediaElement): MediaElementAudioSourceNode;
createOscillator(): OscillatorNode;
createPanner(): PannerNode;
createPeriodicWave(real: any, imag: any): PeriodicWave;
createPeriodicWave(real: Float32Array, imag: Float32Array): PeriodicWave;
createScriptProcessor(bufferSize?: number, numberOfInputChannels?: number, numberOfOutputChannels?: number): ScriptProcessorNode;
createStereoPanner(): StereoPannerNode;
createWaveShaper(): WaveShaperNode;
@ -609,7 +609,7 @@ interface AudioParam {
linearRampToValueAtTime(value: number, endTime: number): void;
setTargetAtTime(target: number, startTime: number, timeConstant: number): void;
setValueAtTime(value: number, startTime: number): void;
setValueCurveAtTime(values: any, startTime: number, duration: number): void;
setValueCurveAtTime(values: Float32Array, startTime: number, duration: number): void;
}
declare var AudioParam: {
@ -685,7 +685,7 @@ interface BiquadFilterNode extends AudioNode {
frequency: AudioParam;
gain: AudioParam;
type: string;
getFrequencyResponse(frequencyHz: any, magResponse: any, phaseResponse: any): void;
getFrequencyResponse(frequencyHz: Float32Array, magResponse: Float32Array, phaseResponse: Float32Array): void;
}
declare var BiquadFilterNode: {
@ -1284,7 +1284,7 @@ declare var CanvasPattern: {
interface CanvasRenderingContext2D {
canvas: HTMLCanvasElement;
fillStyle: any;
fillStyle: string | CanvasGradient | CanvasPattern;
font: string;
globalAlpha: number;
globalCompositeOperation: string;
@ -1299,7 +1299,7 @@ interface CanvasRenderingContext2D {
shadowColor: string;
shadowOffsetX: number;
shadowOffsetY: number;
strokeStyle: any;
strokeStyle: string | CanvasGradient | CanvasPattern;
textAlign: string;
textBaseline: string;
arc(x: number, y: number, radius: number, startAngle: number, endAngle: number, anticlockwise?: boolean): void;
@ -2667,8 +2667,6 @@ interface Document extends Node, GlobalEventHandlers, NodeSelector, DocumentEven
importNode(importedNode: Node, deep: boolean): Node;
msElementsFromPoint(x: number, y: number): NodeList;
msElementsFromRect(left: number, top: number, width: number, height: number): NodeList;
msGetPrintDocumentForNamedFlow(flowName: string): Document;
msSetPrintDocumentUriForNamedFlow(flowName: string, uri: string): void;
/**
* Opens a new window and loads a document specified by a given URL. Also, opens a new window that uses the url parameter and the name parameter to collect the output of the write method and the writeln method.
* @param url Specifies a MIME type for the document.
@ -7490,27 +7488,6 @@ declare var MSHTMLWebViewElement: {
new(): MSHTMLWebViewElement;
}
interface MSHeaderFooter {
URL: string;
dateLong: string;
dateShort: string;
font: string;
htmlFoot: string;
htmlHead: string;
page: number;
pageTotal: number;
textFoot: string;
textHead: string;
timeLong: string;
timeShort: string;
title: string;
}
declare var MSHeaderFooter: {
prototype: MSHeaderFooter;
new(): MSHeaderFooter;
}
interface MSInputMethodContext extends EventTarget {
compositionEndOffset: number;
compositionStartOffset: number;
@ -7669,24 +7646,6 @@ declare var MSPointerEvent: {
new(typeArg: string, eventInitDict?: PointerEventInit): MSPointerEvent;
}
interface MSPrintManagerTemplatePrinter extends MSTemplatePrinter, EventTarget {
percentScale: number;
showHeaderFooter: boolean;
shrinkToFit: boolean;
drawPreviewPage(element: HTMLElement, pageNumber: number): void;
endPrint(): void;
getPrintTaskOptionValue(key: string): any;
invalidatePreview(): void;
setPageCount(pageCount: number): void;
startPrint(): void;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var MSPrintManagerTemplatePrinter: {
prototype: MSPrintManagerTemplatePrinter;
new(): MSPrintManagerTemplatePrinter;
}
interface MSRangeCollection {
length: number;
item(index: number): Range;
@ -7734,63 +7693,6 @@ declare var MSStreamReader: {
new(): MSStreamReader;
}
interface MSTemplatePrinter {
collate: boolean;
copies: number;
currentPage: boolean;
currentPageAvail: boolean;
duplex: boolean;
footer: string;
frameActive: boolean;
frameActiveEnabled: boolean;
frameAsShown: boolean;
framesetDocument: boolean;
header: string;
headerFooterFont: string;
marginBottom: number;
marginLeft: number;
marginRight: number;
marginTop: number;
orientation: string;
pageFrom: number;
pageHeight: number;
pageTo: number;
pageWidth: number;
selectedPages: boolean;
selection: boolean;
selectionEnabled: boolean;
unprintableBottom: number;
unprintableLeft: number;
unprintableRight: number;
unprintableTop: number;
usePrinterCopyCollate: boolean;
createHeaderFooter(): MSHeaderFooter;
deviceSupports(property: string): any;
ensurePrintDialogDefaults(): boolean;
getPageMarginBottom(pageRule: CSSPageRule, pageWidth: number, pageHeight: number): any;
getPageMarginBottomImportant(pageRule: CSSPageRule): boolean;
getPageMarginLeft(pageRule: CSSPageRule, pageWidth: number, pageHeight: number): any;
getPageMarginLeftImportant(pageRule: CSSPageRule): boolean;
getPageMarginRight(pageRule: CSSPageRule, pageWidth: number, pageHeight: number): any;
getPageMarginRightImportant(pageRule: CSSPageRule): boolean;
getPageMarginTop(pageRule: CSSPageRule, pageWidth: number, pageHeight: number): any;
getPageMarginTopImportant(pageRule: CSSPageRule): boolean;
printBlankPage(): void;
printNonNative(document: any): boolean;
printNonNativeFrames(document: any, activeFrame: boolean): void;
printPage(element: HTMLElement): void;
showPageSetupDialog(): boolean;
showPrintDialog(): boolean;
startDoc(title: string): boolean;
stopDoc(): void;
updatePageStatus(status: number): void;
}
declare var MSTemplatePrinter: {
prototype: MSTemplatePrinter;
new(): MSTemplatePrinter;
}
interface MSWebViewAsyncOperation extends EventTarget {
error: DOMError;
oncomplete: (ev: Event) => any;
@ -8208,6 +8110,10 @@ declare var Node: {
}
interface NodeFilter {
acceptNode(n: Node): number;
}
declare var NodeFilter: {
FILTER_ACCEPT: number;
FILTER_REJECT: number;
FILTER_SKIP: number;
@ -8225,7 +8131,6 @@ interface NodeFilter {
SHOW_PROCESSING_INSTRUCTION: number;
SHOW_TEXT: number;
}
declare var NodeFilter: NodeFilter;
interface NodeIterator {
expandEntityReferences: boolean;
@ -8935,7 +8840,6 @@ declare var SVGDescElement: {
interface SVGElement extends Element {
id: string;
className: any;
onclick: (ev: MouseEvent) => any;
ondblclick: (ev: MouseEvent) => any;
onfocusin: (ev: FocusEvent) => any;
@ -8949,6 +8853,7 @@ interface SVGElement extends Element {
ownerSVGElement: SVGSVGElement;
viewportElement: SVGElement;
xmlbase: string;
className: any;
addEventListener(type: "MSGestureChange", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureDoubleTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureEnd", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
@ -11110,7 +11015,7 @@ declare var WEBGL_depth_texture: {
}
interface WaveShaperNode extends AudioNode {
curve: any;
curve: Float32Array;
oversample: string;
}
@ -11297,34 +11202,34 @@ interface WebGLRenderingContext {
texSubImage2D(target: number, level: number, xoffset: number, yoffset: number, format: number, type: number, video: HTMLVideoElement): void;
texSubImage2D(target: number, level: number, xoffset: number, yoffset: number, format: number, type: number, pixels: ImageData): void;
uniform1f(location: WebGLUniformLocation, x: number): void;
uniform1fv(location: WebGLUniformLocation, v: any): void;
uniform1fv(location: WebGLUniformLocation, v: Float32Array): void;
uniform1i(location: WebGLUniformLocation, x: number): void;
uniform1iv(location: WebGLUniformLocation, v: Int32Array): void;
uniform2f(location: WebGLUniformLocation, x: number, y: number): void;
uniform2fv(location: WebGLUniformLocation, v: any): void;
uniform2fv(location: WebGLUniformLocation, v: Float32Array): void;
uniform2i(location: WebGLUniformLocation, x: number, y: number): void;
uniform2iv(location: WebGLUniformLocation, v: Int32Array): void;
uniform3f(location: WebGLUniformLocation, x: number, y: number, z: number): void;
uniform3fv(location: WebGLUniformLocation, v: any): void;
uniform3fv(location: WebGLUniformLocation, v: Float32Array): void;
uniform3i(location: WebGLUniformLocation, x: number, y: number, z: number): void;
uniform3iv(location: WebGLUniformLocation, v: Int32Array): void;
uniform4f(location: WebGLUniformLocation, x: number, y: number, z: number, w: number): void;
uniform4fv(location: WebGLUniformLocation, v: any): void;
uniform4fv(location: WebGLUniformLocation, v: Float32Array): void;
uniform4i(location: WebGLUniformLocation, x: number, y: number, z: number, w: number): void;
uniform4iv(location: WebGLUniformLocation, v: Int32Array): void;
uniformMatrix2fv(location: WebGLUniformLocation, transpose: boolean, value: any): void;
uniformMatrix3fv(location: WebGLUniformLocation, transpose: boolean, value: any): void;
uniformMatrix4fv(location: WebGLUniformLocation, transpose: boolean, value: any): void;
uniformMatrix2fv(location: WebGLUniformLocation, transpose: boolean, value: Float32Array): void;
uniformMatrix3fv(location: WebGLUniformLocation, transpose: boolean, value: Float32Array): void;
uniformMatrix4fv(location: WebGLUniformLocation, transpose: boolean, value: Float32Array): void;
useProgram(program: WebGLProgram): void;
validateProgram(program: WebGLProgram): void;
vertexAttrib1f(indx: number, x: number): void;
vertexAttrib1fv(indx: number, values: any): void;
vertexAttrib1fv(indx: number, values: Float32Array): void;
vertexAttrib2f(indx: number, x: number, y: number): void;
vertexAttrib2fv(indx: number, values: any): void;
vertexAttrib2fv(indx: number, values: Float32Array): void;
vertexAttrib3f(indx: number, x: number, y: number, z: number): void;
vertexAttrib3fv(indx: number, values: any): void;
vertexAttrib3fv(indx: number, values: Float32Array): void;
vertexAttrib4f(indx: number, x: number, y: number, z: number, w: number): void;
vertexAttrib4fv(indx: number, values: any): void;
vertexAttrib4fv(indx: number, values: Float32Array): void;
vertexAttribPointer(indx: number, size: number, type: number, normalized: boolean, stride: number, offset: number): void;
viewport(x: number, y: number, width: number, height: number): void;
ACTIVE_ATTRIBUTES: number;
@ -12088,7 +11993,6 @@ interface Window extends EventTarget, WindowTimers, WindowSessionStorage, Window
locationbar: BarProp;
menubar: BarProp;
msAnimationStartTime: number;
msTemplatePrinter: MSTemplatePrinter;
name: string;
navigator: Navigator;
offscreenBuffering: string | boolean;
@ -12825,7 +12729,6 @@ interface XMLHttpRequestEventTarget {
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
interface NodeListOf<TNode extends Node> extends NodeList {
length: number;
item(index: number): TNode;
@ -12846,8 +12749,6 @@ interface EventListenerObject {
handleEvent(evt: Event): void;
}
declare type EventListenerOrEventListenerObject = EventListener | EventListenerObject;
interface MessageEventInit extends EventInit {
data?: any;
origin?: string;
@ -12863,6 +12764,8 @@ interface ProgressEventInit extends EventInit {
total?: number;
}
declare type EventListenerOrEventListenerObject = EventListener | EventListenerObject;
interface ErrorEventHandler {
(message: string, filename?: string, lineno?: number, colno?: number, error?:Error): void;
}
@ -12923,7 +12826,6 @@ declare var location: Location;
declare var locationbar: BarProp;
declare var menubar: BarProp;
declare var msAnimationStartTime: number;
declare var msTemplatePrinter: MSTemplatePrinter;
declare var name: string;
declare var navigator: Navigator;
declare var offscreenBuffering: string | boolean;

View file

@ -3965,7 +3965,34 @@ interface ObjectConstructor {
* Copy the values of all of the enumerable own properties from one or more source objects to a
* target object. Returns the target object.
* @param target The target object to copy to.
* @param sources One or more source objects to copy properties from.
* @param source The source object from which to copy properties.
*/
assign<T, U>(target: T, source: U): T & U;
/**
* Copy the values of all of the enumerable own properties from one or more source objects to a
* target object. Returns the target object.
* @param target The target object to copy to.
* @param source1 The first source object from which to copy properties.
* @param source2 The second source object from which to copy properties.
*/
assign<T, U, V>(target: T, source1: U, source2: V): T & U & V;
/**
* Copy the values of all of the enumerable own properties from one or more source objects to a
* target object. Returns the target object.
* @param target The target object to copy to.
* @param source1 The first source object from which to copy properties.
* @param source2 The second source object from which to copy properties.
* @param source3 The third source object from which to copy properties.
*/
assign<T, U, V, W>(target: T, source1: U, source2: V, source3: W): T & U & V & W;
/**
* Copy the values of all of the enumerable own properties from one or more source objects to a
* target object. Returns the target object.
* @param target The target object to copy to.
* @param sources One or more source objects from which to copy properties
*/
assign(target: any, ...sources: any[]): any;
@ -5169,7 +5196,7 @@ declare module Intl {
currency?: string;
currencyDisplay?: string;
useGrouping?: boolean;
minimumintegerDigits?: number;
minimumIntegerDigits?: number;
minimumFractionDigits?: number;
maximumFractionDigits?: number;
minimumSignificantDigits?: number;
@ -5182,7 +5209,7 @@ declare module Intl {
style: string;
currency?: string;
currencyDisplay?: string;
minimumintegerDigits: number;
minimumIntegerDigits: number;
minimumFractionDigits: number;
maximumFractionDigits: number;
minimumSignificantDigits?: number;
@ -5531,8 +5558,8 @@ interface AnalyserNode extends AudioNode {
smoothingTimeConstant: number;
getByteFrequencyData(array: Uint8Array): void;
getByteTimeDomainData(array: Uint8Array): void;
getFloatFrequencyData(array: any): void;
getFloatTimeDomainData(array: any): void;
getFloatFrequencyData(array: Float32Array): void;
getFloatTimeDomainData(array: Float32Array): void;
}
declare var AnalyserNode: {
@ -5619,7 +5646,7 @@ interface AudioBuffer {
length: number;
numberOfChannels: number;
sampleRate: number;
getChannelData(channel: number): any;
getChannelData(channel: number): Float32Array;
}
declare var AudioBuffer: {
@ -5663,7 +5690,7 @@ interface AudioContext extends EventTarget {
createMediaElementSource(mediaElement: HTMLMediaElement): MediaElementAudioSourceNode;
createOscillator(): OscillatorNode;
createPanner(): PannerNode;
createPeriodicWave(real: any, imag: any): PeriodicWave;
createPeriodicWave(real: Float32Array, imag: Float32Array): PeriodicWave;
createScriptProcessor(bufferSize?: number, numberOfInputChannels?: number, numberOfOutputChannels?: number): ScriptProcessorNode;
createStereoPanner(): StereoPannerNode;
createWaveShaper(): WaveShaperNode;
@ -5721,7 +5748,7 @@ interface AudioParam {
linearRampToValueAtTime(value: number, endTime: number): void;
setTargetAtTime(target: number, startTime: number, timeConstant: number): void;
setValueAtTime(value: number, startTime: number): void;
setValueCurveAtTime(values: any, startTime: number, duration: number): void;
setValueCurveAtTime(values: Float32Array, startTime: number, duration: number): void;
}
declare var AudioParam: {
@ -5797,7 +5824,7 @@ interface BiquadFilterNode extends AudioNode {
frequency: AudioParam;
gain: AudioParam;
type: string;
getFrequencyResponse(frequencyHz: any, magResponse: any, phaseResponse: any): void;
getFrequencyResponse(frequencyHz: Float32Array, magResponse: Float32Array, phaseResponse: Float32Array): void;
}
declare var BiquadFilterNode: {
@ -6396,7 +6423,7 @@ declare var CanvasPattern: {
interface CanvasRenderingContext2D {
canvas: HTMLCanvasElement;
fillStyle: any;
fillStyle: string | CanvasGradient | CanvasPattern;
font: string;
globalAlpha: number;
globalCompositeOperation: string;
@ -6411,7 +6438,7 @@ interface CanvasRenderingContext2D {
shadowColor: string;
shadowOffsetX: number;
shadowOffsetY: number;
strokeStyle: any;
strokeStyle: string | CanvasGradient | CanvasPattern;
textAlign: string;
textBaseline: string;
arc(x: number, y: number, radius: number, startAngle: number, endAngle: number, anticlockwise?: boolean): void;
@ -7779,8 +7806,6 @@ interface Document extends Node, GlobalEventHandlers, NodeSelector, DocumentEven
importNode(importedNode: Node, deep: boolean): Node;
msElementsFromPoint(x: number, y: number): NodeList;
msElementsFromRect(left: number, top: number, width: number, height: number): NodeList;
msGetPrintDocumentForNamedFlow(flowName: string): Document;
msSetPrintDocumentUriForNamedFlow(flowName: string, uri: string): void;
/**
* Opens a new window and loads a document specified by a given URL. Also, opens a new window that uses the url parameter and the name parameter to collect the output of the write method and the writeln method.
* @param url Specifies a MIME type for the document.
@ -12602,27 +12627,6 @@ declare var MSHTMLWebViewElement: {
new(): MSHTMLWebViewElement;
}
interface MSHeaderFooter {
URL: string;
dateLong: string;
dateShort: string;
font: string;
htmlFoot: string;
htmlHead: string;
page: number;
pageTotal: number;
textFoot: string;
textHead: string;
timeLong: string;
timeShort: string;
title: string;
}
declare var MSHeaderFooter: {
prototype: MSHeaderFooter;
new(): MSHeaderFooter;
}
interface MSInputMethodContext extends EventTarget {
compositionEndOffset: number;
compositionStartOffset: number;
@ -12781,24 +12785,6 @@ declare var MSPointerEvent: {
new(typeArg: string, eventInitDict?: PointerEventInit): MSPointerEvent;
}
interface MSPrintManagerTemplatePrinter extends MSTemplatePrinter, EventTarget {
percentScale: number;
showHeaderFooter: boolean;
shrinkToFit: boolean;
drawPreviewPage(element: HTMLElement, pageNumber: number): void;
endPrint(): void;
getPrintTaskOptionValue(key: string): any;
invalidatePreview(): void;
setPageCount(pageCount: number): void;
startPrint(): void;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var MSPrintManagerTemplatePrinter: {
prototype: MSPrintManagerTemplatePrinter;
new(): MSPrintManagerTemplatePrinter;
}
interface MSRangeCollection {
length: number;
item(index: number): Range;
@ -12846,63 +12832,6 @@ declare var MSStreamReader: {
new(): MSStreamReader;
}
interface MSTemplatePrinter {
collate: boolean;
copies: number;
currentPage: boolean;
currentPageAvail: boolean;
duplex: boolean;
footer: string;
frameActive: boolean;
frameActiveEnabled: boolean;
frameAsShown: boolean;
framesetDocument: boolean;
header: string;
headerFooterFont: string;
marginBottom: number;
marginLeft: number;
marginRight: number;
marginTop: number;
orientation: string;
pageFrom: number;
pageHeight: number;
pageTo: number;
pageWidth: number;
selectedPages: boolean;
selection: boolean;
selectionEnabled: boolean;
unprintableBottom: number;
unprintableLeft: number;
unprintableRight: number;
unprintableTop: number;
usePrinterCopyCollate: boolean;
createHeaderFooter(): MSHeaderFooter;
deviceSupports(property: string): any;
ensurePrintDialogDefaults(): boolean;
getPageMarginBottom(pageRule: CSSPageRule, pageWidth: number, pageHeight: number): any;
getPageMarginBottomImportant(pageRule: CSSPageRule): boolean;
getPageMarginLeft(pageRule: CSSPageRule, pageWidth: number, pageHeight: number): any;
getPageMarginLeftImportant(pageRule: CSSPageRule): boolean;
getPageMarginRight(pageRule: CSSPageRule, pageWidth: number, pageHeight: number): any;
getPageMarginRightImportant(pageRule: CSSPageRule): boolean;
getPageMarginTop(pageRule: CSSPageRule, pageWidth: number, pageHeight: number): any;
getPageMarginTopImportant(pageRule: CSSPageRule): boolean;
printBlankPage(): void;
printNonNative(document: any): boolean;
printNonNativeFrames(document: any, activeFrame: boolean): void;
printPage(element: HTMLElement): void;
showPageSetupDialog(): boolean;
showPrintDialog(): boolean;
startDoc(title: string): boolean;
stopDoc(): void;
updatePageStatus(status: number): void;
}
declare var MSTemplatePrinter: {
prototype: MSTemplatePrinter;
new(): MSTemplatePrinter;
}
interface MSWebViewAsyncOperation extends EventTarget {
error: DOMError;
oncomplete: (ev: Event) => any;
@ -13320,6 +13249,10 @@ declare var Node: {
}
interface NodeFilter {
acceptNode(n: Node): number;
}
declare var NodeFilter: {
FILTER_ACCEPT: number;
FILTER_REJECT: number;
FILTER_SKIP: number;
@ -13337,7 +13270,6 @@ interface NodeFilter {
SHOW_PROCESSING_INSTRUCTION: number;
SHOW_TEXT: number;
}
declare var NodeFilter: NodeFilter;
interface NodeIterator {
expandEntityReferences: boolean;
@ -14047,7 +13979,6 @@ declare var SVGDescElement: {
interface SVGElement extends Element {
id: string;
className: any;
onclick: (ev: MouseEvent) => any;
ondblclick: (ev: MouseEvent) => any;
onfocusin: (ev: FocusEvent) => any;
@ -14061,6 +13992,7 @@ interface SVGElement extends Element {
ownerSVGElement: SVGSVGElement;
viewportElement: SVGElement;
xmlbase: string;
className: any;
addEventListener(type: "MSGestureChange", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureDoubleTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureEnd", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
@ -16222,7 +16154,7 @@ declare var WEBGL_depth_texture: {
}
interface WaveShaperNode extends AudioNode {
curve: any;
curve: Float32Array;
oversample: string;
}
@ -16409,34 +16341,34 @@ interface WebGLRenderingContext {
texSubImage2D(target: number, level: number, xoffset: number, yoffset: number, format: number, type: number, video: HTMLVideoElement): void;
texSubImage2D(target: number, level: number, xoffset: number, yoffset: number, format: number, type: number, pixels: ImageData): void;
uniform1f(location: WebGLUniformLocation, x: number): void;
uniform1fv(location: WebGLUniformLocation, v: any): void;
uniform1fv(location: WebGLUniformLocation, v: Float32Array): void;
uniform1i(location: WebGLUniformLocation, x: number): void;
uniform1iv(location: WebGLUniformLocation, v: Int32Array): void;
uniform2f(location: WebGLUniformLocation, x: number, y: number): void;
uniform2fv(location: WebGLUniformLocation, v: any): void;
uniform2fv(location: WebGLUniformLocation, v: Float32Array): void;
uniform2i(location: WebGLUniformLocation, x: number, y: number): void;
uniform2iv(location: WebGLUniformLocation, v: Int32Array): void;
uniform3f(location: WebGLUniformLocation, x: number, y: number, z: number): void;
uniform3fv(location: WebGLUniformLocation, v: any): void;
uniform3fv(location: WebGLUniformLocation, v: Float32Array): void;
uniform3i(location: WebGLUniformLocation, x: number, y: number, z: number): void;
uniform3iv(location: WebGLUniformLocation, v: Int32Array): void;
uniform4f(location: WebGLUniformLocation, x: number, y: number, z: number, w: number): void;
uniform4fv(location: WebGLUniformLocation, v: any): void;
uniform4fv(location: WebGLUniformLocation, v: Float32Array): void;
uniform4i(location: WebGLUniformLocation, x: number, y: number, z: number, w: number): void;
uniform4iv(location: WebGLUniformLocation, v: Int32Array): void;
uniformMatrix2fv(location: WebGLUniformLocation, transpose: boolean, value: any): void;
uniformMatrix3fv(location: WebGLUniformLocation, transpose: boolean, value: any): void;
uniformMatrix4fv(location: WebGLUniformLocation, transpose: boolean, value: any): void;
uniformMatrix2fv(location: WebGLUniformLocation, transpose: boolean, value: Float32Array): void;
uniformMatrix3fv(location: WebGLUniformLocation, transpose: boolean, value: Float32Array): void;
uniformMatrix4fv(location: WebGLUniformLocation, transpose: boolean, value: Float32Array): void;
useProgram(program: WebGLProgram): void;
validateProgram(program: WebGLProgram): void;
vertexAttrib1f(indx: number, x: number): void;
vertexAttrib1fv(indx: number, values: any): void;
vertexAttrib1fv(indx: number, values: Float32Array): void;
vertexAttrib2f(indx: number, x: number, y: number): void;
vertexAttrib2fv(indx: number, values: any): void;
vertexAttrib2fv(indx: number, values: Float32Array): void;
vertexAttrib3f(indx: number, x: number, y: number, z: number): void;
vertexAttrib3fv(indx: number, values: any): void;
vertexAttrib3fv(indx: number, values: Float32Array): void;
vertexAttrib4f(indx: number, x: number, y: number, z: number, w: number): void;
vertexAttrib4fv(indx: number, values: any): void;
vertexAttrib4fv(indx: number, values: Float32Array): void;
vertexAttribPointer(indx: number, size: number, type: number, normalized: boolean, stride: number, offset: number): void;
viewport(x: number, y: number, width: number, height: number): void;
ACTIVE_ATTRIBUTES: number;
@ -17200,7 +17132,6 @@ interface Window extends EventTarget, WindowTimers, WindowSessionStorage, Window
locationbar: BarProp;
menubar: BarProp;
msAnimationStartTime: number;
msTemplatePrinter: MSTemplatePrinter;
name: string;
navigator: Navigator;
offscreenBuffering: string | boolean;
@ -17937,7 +17868,6 @@ interface XMLHttpRequestEventTarget {
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
interface NodeListOf<TNode extends Node> extends NodeList {
length: number;
item(index: number): TNode;
@ -17958,8 +17888,6 @@ interface EventListenerObject {
handleEvent(evt: Event): void;
}
declare type EventListenerOrEventListenerObject = EventListener | EventListenerObject;
interface MessageEventInit extends EventInit {
data?: any;
origin?: string;
@ -17975,6 +17903,8 @@ interface ProgressEventInit extends EventInit {
total?: number;
}
declare type EventListenerOrEventListenerObject = EventListener | EventListenerObject;
interface ErrorEventHandler {
(message: string, filename?: string, lineno?: number, colno?: number, error?:Error): void;
}
@ -18035,7 +17965,6 @@ declare var location: Location;
declare var locationbar: BarProp;
declare var menubar: BarProp;
declare var msAnimationStartTime: number;
declare var msTemplatePrinter: MSTemplatePrinter;
declare var name: string;
declare var navigator: Navigator;
declare var offscreenBuffering: string | boolean;

View file

@ -57,7 +57,7 @@ declare module Intl {
currency?: string;
currencyDisplay?: string;
useGrouping?: boolean;
minimumintegerDigits?: number;
minimumIntegerDigits?: number;
minimumFractionDigits?: number;
maximumFractionDigits?: number;
minimumSignificantDigits?: number;
@ -70,7 +70,7 @@ declare module Intl {
style: string;
currency?: string;
currencyDisplay?: string;
minimumintegerDigits: number;
minimumIntegerDigits: number;
minimumFractionDigits: number;
maximumFractionDigits: number;
minimumSignificantDigits?: number;
@ -234,7 +234,7 @@ interface AudioBuffer {
length: number;
numberOfChannels: number;
sampleRate: number;
getChannelData(channel: number): any;
getChannelData(channel: number): Float32Array;
}
declare var AudioBuffer: {
@ -1111,7 +1111,6 @@ interface WorkerUtils extends Object, WindowBase64 {
setTimeout(handler: any, timeout?: any, ...args: any[]): number;
}
interface BlobPropertyBag {
type?: string;
endings?: string;
@ -1126,8 +1125,6 @@ interface EventListenerObject {
handleEvent(evt: Event): void;
}
declare type EventListenerOrEventListenerObject = EventListener | EventListenerObject;
interface MessageEventInit extends EventInit {
data?: any;
origin?: string;
@ -1143,6 +1140,8 @@ interface ProgressEventInit extends EventInit {
total?: number;
}
declare type EventListenerOrEventListenerObject = EventListener | EventListenerObject;
interface ErrorEventHandler {
(message: string, filename?: string, lineno?: number, colno?: number, error?:Error): void;
}

File diff suppressed because it is too large Load diff

View file

@ -53,7 +53,7 @@ function registerSupports(modeID: string, host: TypeScriptServiceClientHost, cli
languages.registerDocumentHighlightProvider(modeID, new DocumentHighlightProvider(client));
languages.registerReferenceProvider(modeID, new ReferenceProvider(client));
languages.registerDocumentSymbolProvider(modeID, new DocumentSymbolProvider(client));
languages.registerSignatureHelpProvider(modeID, new SignatureHelpProvider(client), '(', ';');
languages.registerSignatureHelpProvider(modeID, new SignatureHelpProvider(client), '(', ',');
languages.registerRenameProvider(modeID, new RenameProvider(client));
languages.registerDocumentRangeFormattingEditProvider(modeID, new FormattingProvider(client));
languages.registerOnTypeFormattingEditProvider(modeID, new FormattingProvider(client), ';', '}', '\n');
@ -149,7 +149,9 @@ class TypeScriptServiceClientHost implements ITypescriptServiceClientHost {
this.triggerAllDiagnostics();
};
let handleProjectChange = () => {
this.triggerAllDiagnostics();
setTimeout(() => {
this.triggerAllDiagnostics();
}, 1500);
}
let watcher = workspace.createFileSystemWatcher('**/tsconfig.json');
watcher.onDidCreate(handleProjectCreateOrDelete);

View file

@ -6,7 +6,7 @@
"contributes": {
"languages": [{
"id": "vb",
"extensions": [ ".vb" ],
"extensions": [ ".vb", ".brs" ],
"aliases": [ "Visual Basic", "vb" ],
"configuration": "./vb.configuration.json"
}],

View file

@ -0,0 +1,17 @@
// A launch configuration that compiles the extension and then opens it inside a new window
{
"version": "0.1.0",
"configurations": [
{
"name": "Launch Tests",
"type": "extensionHost",
"request": "launch",
"runtimeExecutable": "${execPath}",
"args": ["${workspaceRoot}/../../", "${workspaceRoot}/testWorkspace", "--extensionDevelopmentPath=${workspaceRoot}", "--extensionTestsPath=${workspaceRoot}/out" ],
"stopOnEntry": false,
"sourceMaps": true,
"outDir": "out",
"preLaunchTask": "npm"
}
]
}

View file

@ -0,0 +1,30 @@
// Available variables which can be used inside of strings.
// ${workspaceRoot}: the root folder of the team
// ${file}: the current opened file
// ${fileBasename}: the current opened file's basename
// ${fileDirname}: the current opened file's dirname
// ${fileExtname}: the current opened file's extension
// ${cwd}: the current working directory of the spawned process
// A task runner that calls a custom npm script that compiles the extension.
{
"version": "0.1.0",
// we want to run npm
"command": "npm",
// the command is a shell script
"isShellCommand": true,
// show the output window only if unrecognized errors occur.
"showOutput": "silent",
// we run the custom script "compile" as defined in package.json
"args": ["run", "compile", "--loglevel", "silent"],
// The tsc compiler is started in watching mode
"isWatching": true,
// use the standard tsc in watch mode problem matcher to find compile problems in the output.
"problemMatcher": "$tsc-watch"
}

View file

@ -1,9 +1,6 @@
.vscode/**
typings/**
out/test/**
test/**
**/*.ts
**/*.map
.gitignore
tsconfig.json
vsc-extension-quickstart.md

View file

@ -1,14 +0,0 @@
# README
## This is the README for your extension "vscode-api-tests"
-------------------
You can author your README using Visual Studio Code. Here are some useful editor keyboard shortcuts:
* Split the editor (`Cmd+\` on OSX or `Ctrl+\` on Windows and Linux)
* Toggle preview (`Shift+CMD+V` on OSX or `Shift+Ctrl+V` on Windows and Linux)
* Press `Ctrl+Space` (Windows, Linux) or `Cmd+Space` (OSX) to see a list of Markdown snippets
### For more information
* [Visual Studio Code's Markdown Support](http://code.visualstudio.com/docs/languages/markdown)
* [Markdown Syntax Reference](https://help.github.com/articles/markdown-basics/)
** Enjoy!**

View file

@ -1,15 +1,18 @@
{
"name": "vscode-api-tests",
"description": "",
"description": "API tests for VS Code",
"version": "0.0.1",
"publisher": "vscode",
"private": true,
"engines": {
"vscode": "*"
},
"scripts": {
"compile": "node ./node_modules/vscode/bin/compile -watch -p ./",
"vscode:prepublish": "node ../../node_modules/gulp/bin/gulp.js --gulpfile ../../gulpfile.plugins.js compile-plugin:vscode-api-tests ./tsconfig.json"
},
"devDependencies": {
"typescript": "^1.6.2",
"vscode": "next"
}
}

View file

@ -0,0 +1,29 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import * as assert from 'assert';
import * as fs from 'fs';
import * as os from 'os';
import {workspace, window, Position, commands} from 'vscode';
import {createRandomFile, deleteFile, cleanUp} from './utils';
import {join} from 'path';
suite("editor tests", () => {
teardown(cleanUp);
// test('calling command completes with the extension host updated properly', () => {
// return workspace.openTextDocument(join(workspace.rootPath, './far.js')).then(doc => {
// return window.showTextDocument(doc).then(editor => {
// assert.equal(window.visibleTextEditors.length, 1);
// return commands.executeCommand('workbench.action.closeAllEditors').then(() => {
// assert.equal(window.visibleTextEditors.length, 0);
// });
// });
// });
// });
});

View file

@ -0,0 +1,41 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import * as assert from 'assert';
import * as fs from 'fs';
import * as os from 'os';
import {workspace, window, Position} from 'vscode';
import {createRandomFile, deleteFile, cleanUp} from './utils';
import {join} from 'path';
suite("editor tests", () => {
teardown(cleanUp);
test('make edit', () => {
return createRandomFile().then(file => {
return workspace.openTextDocument(file).then(doc => {
return window.showTextDocument(doc).then((editor) => {
return editor.edit((builder) => {
builder.insert(new Position(0, 0), 'Hello World');
}).then(applied => {
assert.ok(applied);
assert.equal(doc.getText(), 'Hello World');
assert.ok(doc.isDirty);
return doc.save().then(saved => {
assert.ok(saved);
assert.ok(!doc.isDirty);
return deleteFile(file);
});
});
});
});
});
});
});

View file

@ -21,7 +21,8 @@ const testRunner = require('vscode/lib/testrunner');
// 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
useColors: process.platform !== 'win32', // colored output from test results (only windows cannot handle)
timeout: 10000
});
export= testRunner;

View file

@ -0,0 +1,88 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import * as assert from 'assert';
import * as vscode from 'vscode';
import * as fs from 'fs';
import * as os from 'os';
import {join} from 'path';
function rndName() {
return Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 10);
}
export function createRandomFile(contents = ''): Thenable<vscode.Uri> {
return new Promise((resolve, reject) => {
const tmpFile = join(os.tmpdir(), rndName());
fs.writeFile(tmpFile, contents, (error) => {
if (error) {
return reject(error);
}
resolve(vscode.Uri.file(tmpFile));
});
});
}
export function pathEquals(path1: string, path2: string): boolean {
if (process.platform !== 'linux') {
path1 = path1.toLowerCase();
path2 = path2.toLowerCase();
}
return path1 === path2;
}
export function deleteFile(file: vscode.Uri): Thenable<boolean> {
return new Promise((resolve, reject) => {
fs.unlink(file.fsPath, (err) => {
if (err) {
reject(err);
} else {
resolve(true);
}
});
});
}
export function cleanUp(): Thenable<any> {
return new Promise((c, e) => {
if (vscode.window.visibleTextEditors.length === 0) {
return c();
}
// TODO: the visibleTextEditors variable doesn't seem to be
// up to date after a onDidChangeActiveTextEditor event, not
// even using a setTimeout 0... so we MUST poll :(
const interval = setInterval(() => {
if (vscode.window.visibleTextEditors.length > 0) {
return;
}
clearInterval(interval);
c();
}, 10);
vscode.commands.executeCommand('workbench.action.closeAllEditors')
.then(() => vscode.commands.executeCommand('workbench.files.action.closeAllFiles'))
.then(null, err => {
clearInterval(interval);
e(err);
});
}).then(() => {
assert.equal(vscode.window.visibleTextEditors.length, 0);
assert(!vscode.window.activeTextEditor);
// TODO: we can't yet make this assertion because when
// the phost creates a document and makes no changes to it,
// the main side doesn't know about it and the phost side
// assumes it exists. Calling closeAllFiles will not
// remove it from textDocuments array. :(
// assert.equal(vscode.workspace.textDocuments.length, 0);
});
}

View file

@ -6,12 +6,21 @@
'use strict';
import * as assert from 'assert';
import {window, workspace} from 'vscode';
import {workspace, window} from 'vscode';
import {join} from 'path';
import {cleanUp, pathEquals} from './utils';
suite("window namespace texts", () => {
suite("window namespace tests", () => {
// test('open document fires event', (done) => {
// });
teardown(cleanUp);
test('active text editor', () => {
return workspace.openTextDocument(join(workspace.rootPath, './far.js')).then(doc => {
return window.showTextDocument(doc).then((editor) => {
const active = window.activeTextEditor;
assert.ok(active);
assert.ok(pathEquals(active.document.uri.fsPath, doc.uri.fsPath));
});
});
});
});

View file

@ -6,27 +6,30 @@
'use strict';
import * as assert from 'assert';
import {workspace, TextDocument} from 'vscode';
import {join} from 'path';
import {workspace, TextDocument, window, Position, Uri} from 'vscode';
import {createRandomFile, deleteFile, cleanUp, pathEquals} from './utils';
import {join, basename} from 'path';
import * as fs from 'fs';
import * as os from 'os';
suite('workspace-namespace', () => {
teardown(cleanUp);
test('textDocuments', () => {
assert.ok(Array.isArray(workspace.textDocuments));
assert.throws(() => workspace.textDocuments = null);
});
test('rootPath', () => {
assert.equal(workspace.rootPath, join(__dirname, '../testWorkspace'));
assert.ok(pathEquals(workspace.rootPath, join(__dirname, '../testWorkspace')));
assert.throws(() => workspace.rootPath = 'farboo');
});
test('openTextDocument', done => {
workspace.openTextDocument(join(workspace.rootPath, './far.js')).then(doc => {
test('openTextDocument', () => {
return workspace.openTextDocument(join(workspace.rootPath, './far.js')).then(doc => {
assert.ok(doc);
done();
}, err => {
done(err);
assert.equal(workspace.textDocuments.length, 1);
});
});
@ -38,17 +41,89 @@ suite('workspace-namespace', () => {
});
});
// test('createTextDocument', done => {
test('openTextDocument, untitled is dirty', function(done) {
if (process.platform === 'win32') {
return done(); // TODO@Joh this test fails on windows
}
// let text = 'Das Pferd isst keinen Reis.'
workspace.openTextDocument(Uri.parse('untitled://' + join(workspace.rootPath, './newfile.txt'))).then(doc => {
assert.equal(doc.uri.scheme, 'untitled');
assert.ok(doc.isDirty);
done();
});
});
// workspace.createTextDocument(text).then(doc => {
// assert.equal(doc.getText(), text);
// test('openTextDocument, untitled closes on save', function(done) {
// workspace.openTextDocument(Uri.parse('untitled://' + join(workspace.rootPath, './newfile2.txt'))).then(doc => {
// assert.equal(doc.uri.scheme, 'untitled');
// assert.equal(doc.languageId, 'plaintext');
// done();
// }, err => {
// done(err);
// assert.ok(doc.isDirty);
// let closed: TextDocument, opened: TextDocument;
// let d0 = workspace.onDidCloseTextDocument(e => closed = e);
// let d1 = workspace.onDidOpenTextDocument(e => opened = e);
// function donedone() {
// assert.ok(closed === doc);
// assert.equal(opened.uri.scheme, 'file');
// assert.equal(opened.uri.toString(), 'file:///' + join(workspace.rootPath, './newfile2.txt'))
// d0.dispose();
// d1.dispose();
// deleteFile(opened.uri).then(done, done);
// }
// doc.save().then(donedone, done);
// });
// });
// })
test('events: onDidOpenTextDocument, onDidChangeTextDocument, onDidSaveTextDocument', () => {
return createRandomFile().then(file => {
let disposables = [];
let onDidOpenTextDocument = false;
disposables.push(workspace.onDidOpenTextDocument(e => {
assert.ok(pathEquals(e.uri.fsPath, file.fsPath));
onDidOpenTextDocument = true;
}));
let onDidChangeTextDocument = false;
disposables.push(workspace.onDidChangeTextDocument(e => {
assert.ok(pathEquals(e.document.uri.fsPath, file.fsPath));
onDidChangeTextDocument = true;
}));
let onDidSaveTextDocument = false;
disposables.push(workspace.onDidSaveTextDocument(e => {
assert.ok(pathEquals(e.uri.fsPath, file.fsPath));
onDidSaveTextDocument = true;
}));
return workspace.openTextDocument(file).then(doc => {
return window.showTextDocument(doc).then((editor) => {
return editor.edit((builder) => {
builder.insert(new Position(0, 0), 'Hello World');
}).then(applied => {
return doc.save().then(saved => {
assert.ok(onDidOpenTextDocument);
assert.ok(onDidChangeTextDocument);
assert.ok(onDidSaveTextDocument);
while (disposables.length) {
disposables.pop().dispose();
}
return deleteFile(file);
});
});
});
});
});
});
test('findFiles', () => {
return workspace.findFiles('*.js', null).then((res) => {
assert.equal(res.length, 1);
assert.equal(basename(workspace.asRelativePath(res[0])), 'far.js');
});
});
});

View file

@ -6,13 +6,70 @@
"contributes": {
"languages": [{
"id": "xml",
"extensions": [ ".xml", ".dtd", ".ascx", ".csproj", ".config", ".wxi", ".wxl", ".wxs", ".xaml", ".svg", ".svgz" ],
"extensions": [
".ascx",
".axml",
".bpmn",
".config",
".cpt",
".csl",
".csproj",
".csproj.user",
".dita",
".ditamap",
".dtd",
".dtml",
".fsproj",
".fxml",
".iml",
".isml",
".jmx",
".launch",
".menu",
".mxml",
".nuspec",
".opml",
".owl",
".proj",
".pt",
".pubxml",
".pubxml.user",
".rdf",
".rng",
".rss",
".shproj",
".storyboard",
".svg",
".targets",
".tld",
".vbproj",
".vbproj.user",
".vcxproj",
".vcxproj.filters",
".wsdl",
".wxi",
".wxl",
".wxs",
".xaml",
".xbl",
".xib",
".xlf",
".xliff",
".xml",
".xpdl",
".xsd",
".xul",
".xoml"
],
"firstLine" : "(\\<\\?xml.*)|(\\<svg)|(\\<\\!doctype\\s+svg)",
"aliases": [ "XML", "xml" ],
"configuration": "./xml.configuration.json"
}, {
"id": "xsl",
"extensions": [ ".xsl", ".xslt" ],
"extensions": [
".xsl",
".xslt"
],
"aliases": [ "XSL", "xsl" ],
"configuration": "./xsl.configuration.json"
}],

View file

@ -13,8 +13,6 @@ var mocha = require('gulp-mocha');
var es = require('event-stream');
var watch = require('./build/lib/watch');
var nls = require('./build/lib/nls');
var style = require('./build/lib/style');
var copyrights = require('./build/lib/copyrights');
var util = require('./build/lib/util');
var reporter = require('./build/lib/reporter')();
var remote = require('gulp-remote-src');
@ -115,71 +113,6 @@ gulp.task('clean', ['clean-client', 'clean-plugins']);
gulp.task('compile', ['compile-client', 'compile-plugins']);
gulp.task('watch', ['watch-client', 'watch-plugins']);
var LINE_FEED_FILES = [
'build/**/*',
'extensions/**/*',
'scripts/**/*',
'src/**/*',
'test/**/*',
'!extensions/csharp-o/bin/**',
'!extensions/**/out/**',
'!**/node_modules/**',
'!**/fixtures/**',
'!**/*.{svg,exe,png,scpt,bat,cur,ttf,woff,eot}',
];
gulp.task('eol-style', function() {
return gulp.src(LINE_FEED_FILES).pipe(style({complain:true}));
});
gulp.task('fix-eol-style', function() {
return gulp.src(LINE_FEED_FILES, { base: '.' }).pipe(style({})).pipe(gulp.dest('.'));
});
var WHITESPACE_FILES = LINE_FEED_FILES.concat([
'!**/lib/**',
'!**/*.d.ts',
'!extensions/typescript/server/**',
'!test/assert.js',
'!**/octicons/**',
'!**/vs/languages/sass/test/common/example.scss',
'!**/vs/languages/less/common/parser/less.grammar.txt',
'!**/vs/languages/css/common/buildscripts/css-schema.xml',
'!**/vs/languages/markdown/common/raw.marked.js',
'!**/vs/base/common/winjs.base.raw.js',
'!**/vs/base/node/terminateProcess.sh',
'!extensions/csharp-o/gulpfile.js',
'!**/vs/base/node/terminateProcess.sh',
'!**/vs/text.js',
'!**/vs/nls.js',
'!**/vs/css.js',
'!**/vs/loader.js',
'!extensions/**/snippets/**',
'!extensions/**/syntaxes/**',
'!extensions/**/themes/**',
]);
gulp.task('whitespace-style', function() {
return gulp.src(WHITESPACE_FILES).pipe(style({complain:true, whitespace:true}));
});
gulp.task('fix-whitespace-style', function() {
return gulp.src(WHITESPACE_FILES, { base: '.' }).pipe(style({whitespace:true})).pipe(gulp.dest('.'));
});
var COPYRIGHTS_FILES = WHITESPACE_FILES.concat([
'!**/*.json',
'!**/*.html',
'!**/test/**',
'!**/*.md',
'!**/*.sh',
'!**/*.txt',
'!src/vs/editor/standalone-languages/swift.ts',
]);
gulp.task('copyrights', function() {
return gulp.src(COPYRIGHTS_FILES, { base: '.' }).pipe(copyrights.copyrights());
});
gulp.task('insert-copyrights', function() {
return gulp.src(COPYRIGHTS_FILES, { base: '.' }).pipe(copyrights.insertCopyrights());
});
gulp.task('test', function () {
return gulp.src('test/all.js')
.pipe(mocha({ ui: 'tdd', delay: true }))
@ -215,6 +148,7 @@ gulp.task('mixin', function () {
.pipe(gulp.dest('.'));
});
require('./build/gulpfile.hygiene');
require('./build/gulpfile.vscode');
require('./build/gulpfile.editor');
require('./build/gulpfile.plugins');

27
npm-shrinkwrap.json generated
View file

@ -416,9 +416,9 @@
"resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz"
},
"vscode-textmate": {
"version": "1.0.6",
"from": "vscode-textmate@1.0.6",
"resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-1.0.6.tgz",
"version": "1.0.8",
"from": "vscode-textmate@1.0.8",
"resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-1.0.8.tgz",
"dependencies": {
"oniguruma": {
"version": "5.1.1",
@ -439,6 +439,11 @@
}
}
},
"native-keymap": {
"version": "0.0.2",
"from": "native-keymap@0.0.2",
"resolved": "https://registry.npmjs.org/native-keymap/-/native-keymap-0.0.2.tgz"
},
"winreg": {
"version": "0.0.12",
"from": "winreg@0.0.12",
@ -460,6 +465,22 @@
"resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz"
}
}
},
"windows-mutex": {
"version": "0.2.0",
"from": "windows-mutex@0.2.0",
"dependencies": {
"bindings": {
"version": "1.2.1",
"from": "bindings@>=1.2.1 <2.0.0",
"resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz"
},
"nan": {
"version": "2.1.0",
"from": "nan@>=2.1.0 <3.0.0",
"resolved": "https://registry.npmjs.org/nan/-/nan-2.1.0.tgz"
}
}
}
}
}

View file

@ -1,87 +1,97 @@
{
"name": "Code",
"version": "0.10.1",
"electronVersion": "0.34.1",
"author": {
"name": "Microsoft Corporation"
},
"main": "./out/vs/workbench/electron-main/bootstrap",
"private": true,
"engines": {
"node": ">= 0.10.0 < 0.11.0"
},
"scripts": {
"test": "node node_modules/mocha/bin/_mocha",
"postinstall": "npm --prefix extensions/csharp-o/ install extensions/csharp-o/"
},
"dependencies": {
"applicationinsights": "0.15.6",
"chokidar": "1.0.5",
"emmet": "^1.3.0",
"getmac": "1.0.7",
"graceful-fs": "4.1.2",
"http-proxy-agent": "^0.2.6",
"https-proxy-agent": "^0.3.5",
"iconv-lite": "^0.4.13",
"sax": "^1.1.1",
"semver": "^4.2.0",
"vscode-textmate": "^1.0.6",
"winreg": "0.0.12",
"yauzl": "^2.3.1"
},
"devDependencies": {
"async": "^1.4.0",
"atom-shell-installer-assets": "^0.2.0",
"azure-storage": "^0.3.1",
"clone": "^1.0.2",
"debounce": "^1.0.0",
"event-stream": "^3.1.7",
"express": "^4.13.1",
"glob": "^5.0.13",
"gulp": "^3.8.9",
"gulp-atom-electron": "^0.17.2",
"gulp-azure-storage": "^0.3.0",
"gulp-bom": "^1.0.0",
"gulp-concat": "^2.6.0",
"gulp-filter": "^3.0.0",
"gulp-insert": "^0.5.0",
"gulp-json-editor": "^2.2.1",
"gulp-minify-css": "^1.2.1",
"clean-css": "3.4.6",
"gulp-mocha": "^2.1.3",
"gulp-remote-src": "^0.4.0",
"gulp-rename": "^1.2.0",
"gulp-sourcemaps": "^1.6.0",
"gulp-tsb": "^1.7.3",
"gulp-uglify": "^1.4.1",
"gulp-util": "^3.0.6",
"gulp-symdest": "^1.0.0",
"gulp-vinyl-zip": "^1.1.0",
"gulp-watch": "^4.2.4",
"innosetup-compiler": "^5.5.60",
"istanbul": "^0.3.17",
"jsdom-no-contextify": "^3.1.0",
"json-comments": "^0.2.1",
"lazy.js": "^0.4.2",
"mime": "1.2.11",
"minimatch": "^2.0.10",
"mkdirp": "^0.5.0",
"mocha": "^2.2.5",
"object-assign": "^4.0.1",
"optimist": "0.3.5",
"queue": "3.0.6",
"rimraf": "^2.2.8",
"sinon": "^1.17.2",
"source-map": "^0.4.4",
"uglify-js": "2.4.8",
"underscore": "^1.8.2",
"vinyl": "^0.4.5"
},
"repository": {
"type": "git",
"url": "https://github.com/Microsoft/vscode.git"
},
"bugs": {
"url": "https://github.com/Microsoft/vscode/issues"
}
"name": "Code",
"version": "0.10.3",
"electronVersion": "0.34.5",
"author": {
"name": "Microsoft Corporation"
},
"main": "./out/vs/workbench/electron-main/bootstrap",
"private": true,
"engines": {
"node": ">= 0.10.0 < 0.11.0"
},
"scripts": {
"test": "node node_modules/mocha/bin/_mocha",
"preinstall": "node build/npm/preinstall.js",
"postinstall": "npm --prefix extensions/vscode-api-tests/ install extensions/vscode-api-tests/"
},
"dependencies": {
"applicationinsights": "0.15.6",
"chokidar": "1.0.5",
"emmet": "^1.3.0",
"getmac": "1.0.7",
"graceful-fs": "4.1.2",
"http-proxy-agent": "^0.2.6",
"https-proxy-agent": "^0.3.5",
"iconv-lite": "^0.4.13",
"sax": "^1.1.1",
"semver": "^4.2.0",
"vscode-textmate": "^1.0.8",
"native-keymap": "^0.0.2",
"winreg": "0.0.12",
"yauzl": "^2.3.1"
},
"devDependencies": {
"async": "^1.4.0",
"azure-storage": "^0.3.1",
"clean-css": "3.4.6",
"clone": "^1.0.2",
"debounce": "^1.0.0",
"event-stream": "^3.1.7",
"express": "^4.13.1",
"ghooks": "^1.0.1",
"glob": "^5.0.13",
"gulp": "^3.8.9",
"gulp-atom-electron": "^1.1.0",
"gulp-azure-storage": "^0.3.0",
"gulp-bom": "^1.0.0",
"gulp-concat": "^2.6.0",
"gulp-filter": "^3.0.0",
"gulp-insert": "^0.5.0",
"gulp-json-editor": "^2.2.1",
"gulp-minify-css": "^1.2.1",
"gulp-mocha": "^2.1.3",
"gulp-remote-src": "^0.4.0",
"gulp-rename": "^1.2.0",
"gulp-sourcemaps": "^1.6.0",
"gulp-symdest": "^1.0.0",
"gulp-tsb": "^1.7.3",
"gulp-uglify": "^1.4.1",
"gulp-util": "^3.0.6",
"gulp-vinyl-zip": "^1.1.0",
"gulp-watch": "^4.2.4",
"innosetup-compiler": "^5.5.60",
"istanbul": "^0.3.17",
"jsdom-no-contextify": "^3.1.0",
"json-comments": "^0.2.1",
"lazy.js": "^0.4.2",
"mime": "1.2.11",
"minimatch": "^2.0.10",
"mkdirp": "^0.5.0",
"mocha": "^2.2.5",
"object-assign": "^4.0.1",
"optimist": "0.3.5",
"queue": "3.0.6",
"rimraf": "^2.2.8",
"sinon": "^1.17.2",
"source-map": "^0.4.4",
"uglify-js": "2.4.8",
"underscore": "^1.8.2",
"vinyl": "^0.4.5"
},
"repository": {
"type": "git",
"url": "https://github.com/Microsoft/vscode.git"
},
"bugs": {
"url": "https://github.com/Microsoft/vscode/issues"
},
"config": {
"ghooks": {
"pre-commit": "node build/gulpfile.hygiene.js"
}
},
"optionalDependencies": {
"windows-mutex": "^0.2.0"
}
}

View file

@ -4,6 +4,7 @@
"win32ExeBasename": "CodeOSS",
"companyName": "Microsoft Corporation",
"copyright": "Copyright (C) 2015 Microsoft. All rights reserved",
"licenseUrl": "https://github.com/Microsoft/vscode/blob/master/LICENSE.txt",
"darwinBundleIdentifier": "code.visualstudio.com.Code",
"darwinApplicationCategoryType": "public.app-category.developer-tools",
"darwinBundleDocumentTypes": [{

View file

@ -1,12 +1,24 @@
@echo off
title VSCode Dev
pushd %~dp0\..
:: Node modules
if not exist node_modules call .\scripts\npm.bat install
:: Get electron
node .\node_modules\gulp\bin\gulp.js electron
:: Build
if not exist out node .\node_modules\gulp\bin\gulp.js compile
:: Configuration
set NODE_ENV=development
set VSCODE_DEV=1
set ELECTRON_DEFAULT_ERROR_MODE=1
set ELECTRON_ENABLE_LOGGING=1
set ELECTRON_ENABLE_STACK_DUMPING=1
pushd %~dp0\..
node .\node_modules\gulp\bin\gulp.js electron
..\Electron-Build\CodeOSS.exe . %*
:: Launch Code
.\.build\electron\CodeOSS.exe . %*
popd

View file

@ -7,17 +7,30 @@ else
ROOT=$(dirname $(dirname $(readlink -f $0)))
fi
# Configuration
export NODE_ENV=development
export VSCODE_DEV=1
export ELECTRON_ENABLE_LOGGING=1
export ELECTRON_ENABLE_STACK_DUMPING=1
function code() {
cd $ROOT
# Prepare
cd $ROOT ; node node_modules/gulp/bin/gulp.js electron
# Node modules
test -d node_modules || ./scripts/npm.sh install
if [[ "$OSTYPE" == "darwin"* ]]; then
cd $ROOT; ../Electron-Build/Electron.app/Contents/MacOS/Electron . $*
else
cd $ROOT; ../Electron-Build/electron . $*
fi
# Get electron
node node_modules/gulp/bin/gulp.js electron
# Build
test -d out || gulp compile
# Configuration
export NODE_ENV=development
export VSCODE_DEV=1
export ELECTRON_ENABLE_LOGGING=1
export ELECTRON_ENABLE_STACK_DUMPING=1
# Launch Code
if [[ "$OSTYPE" == "darwin"* ]]; then
./.build/electron/Electron.app/Contents/MacOS/Electron . $*
else
./.build/electron/electron . $*
fi
}
code $*

14
src/bootstrap.js vendored
View file

@ -63,16 +63,24 @@ if (!!process.send && process.env.PIPE_LOGGING === 'true') {
return res;
}
function safeSend(arg) {
try {
process.send(arg);
} catch (error) {
// Can happen if the parent channel is closed meanwhile
}
}
// Pass console logging to the outside so that we have it in the main side if told so
if (process.env.VERBOSE_LOGGING === 'true') {
console.log = function () { process.send({ type: '__$console', severity: 'log', arguments: safeStringify(arguments) }); };
console.warn = function () { process.send({ type: '__$console', severity: 'warn', arguments: safeStringify(arguments) }); };
console.log = function () { safeSend({ type: '__$console', severity: 'log', arguments: safeStringify(arguments) }); };
console.warn = function () { safeSend({ type: '__$console', severity: 'warn', arguments: safeStringify(arguments) }); };
} else {
console.log = function () { /* ignore */ };
console.warn = function () { /* ignore */ };
}
console.error = function () { process.send({ type: '__$console', severity: 'error', arguments: safeStringify(arguments) }); };
console.error = function () { safeSend({ type: '__$console', severity: 'error', arguments: safeStringify(arguments) }); };
// Let stdout, stderr and stdin be no-op streams. This prevents an issue where we would get an EBADF
// error when we are inside a forked process and this process tries to access those channels.

View file

@ -5,8 +5,19 @@
declare module 'https-proxy-agent' {
import * as tls from 'tls';
interface IHttpsProxyAgentOptions extends tls.ConnectionOptions {
host: string;
port: number;
secureProxy?: boolean;
secureEndpoint?: boolean;
}
class HttpsProxyAgent {
constructor(proxy: string);
constructor(opts: IHttpsProxyAgentOptions);
}
export = HttpsProxyAgent;
}

View file

@ -3,8 +3,16 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
/// <reference path='../../../../src/vs/vscode.d.ts'/>
/// <reference path='../../../../src/typings/mocha.d.ts'/>
/// <reference path='../../../../extensions/declares.d.ts'/>
/// <reference path='../../../../extensions/node.d.ts'/>
/// <reference path='../../../../extensions/lib.core.d.ts'/>
declare module 'native-keymap' {
export interface INativeKeyMap {
key_code: string;
value: string;
withShift: string;
withAltGr: string;
withShiftAltGr: string;
}
export function getKeyMap(): INativeKeyMap[];
}

View file

@ -0,0 +1,12 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
declare module 'windows-mutex' {
export class Mutex {
constructor(name: string);
isActive(): boolean;
release(): void;
}
}

Some files were not shown because too many files have changed in this diff Show more