Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .clang-format
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,6 @@ Language: JavaScript
BasedOnStyle: Microsoft
ColumnLimit: 0
AlignOperands: AlignAfterOperator
AlignConsecutiveAssignments: AcrossEmptyLinesAndComments
AlignConsecutiveAssignments: AcrossEmptyLinesAndComments
IndentWidth: 4
TabWidth: 4
6 changes: 6 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"editor.formatOnSave": true,
"[typescript]": {
"editor.defaultFormatter": "xaver.clang-format"
}
}
10 changes: 10 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,16 @@
"type": "string",
"default": "error",
"description": "Log level for sclang language server {info, debug, warning, error, critical, all}"
},
"supercollider.codeEvaluation.blinkDuration": {
"type": "number",
"default": 600,
"description": "The amount of time to highlight the executed code"
},
"supercollider.codeEvaluation.showMessage": {
"type": "boolean",
"default": false,
"description": "Show a message toast after code execution"
}
}
}
Expand Down
72 changes: 39 additions & 33 deletions src/commands/evaluate.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,20 +26,19 @@ const evaluateDecorator = vscode.window.createTextEditorDecorationType({
backgroundColor : new vscode.ThemeColor('inputOption.activeBackground'),
isWholeLine : true,
});
const successDecorator = vscode.window.createTextEditorDecorationType({
const successDecorator = vscode.window.createTextEditorDecorationType({
// backgroundColor : new vscode.ThemeColor('inputValidation.infoBackground'),
overviewRulerColor : new vscode.ThemeColor('inputValidation.infoBackground'),
outline : 'border-left-width: 1px',
isWholeLine : true,
});
const errorDecorator = vscode.window.createTextEditorDecorationType({
const errorDecorator = vscode.window.createTextEditorDecorationType({
backgroundColor : new vscode.ThemeColor('inputValidation.errorBackground'),
overviewRulerColor : new vscode.ThemeColor('inputValidation.infoBackground'),
outline : 'border-left-width: 1px',
isWholeLine : true,
});
});
let evaluateCount = 0;
const decoratorTimeout = 5000;

// Start and end execution actions
function onEndEvaluate(textEditor: TextEditor, range: Range, responseText: string, isError: boolean)
Expand All @@ -64,9 +63,9 @@ function onEndEvaluate(textEditor: TextEditor, range: Range, responseText: strin
}
}

function onStartEvaluate(textEditor: TextEditor, range: Range)
function onStartEvaluate(textEditor: TextEditor, range: Range, codeEvaluationSettings: SuperColliderContext["codeEvaluationSettings"])
{
let currentEvaluateCount = ++ evaluateCount;
let currentEvaluateCount = ++evaluateCount;

textEditor.setDecorations(successDecorator, [])
textEditor.setDecorations(errorDecorator, [])
Expand All @@ -81,10 +80,10 @@ function onStartEvaluate(textEditor: TextEditor, range: Range)
{
textEditor.setDecorations(evaluateDecorator, []);
}
}, decoratorTimeout);
}, codeEvaluationSettings.blinkDuration);

return (text: string, isError: boolean) => {
if (evaluateCount == currentEvaluateCount)
if (evaluateCount != currentEvaluateCount)
{
onEndEvaluate(textEditor, range, text, isError)
}
Expand All @@ -110,8 +109,8 @@ function currentDocumentLine()
let startLine = activeTextEditor.document.lineAt(selection.start);
let endLine = activeTextEditor.document.lineAt(selection.end);
let range = new Range(
startLine.range.start,
endLine.range.end);
startLine.range.start,
endLine.range.end);

return range;
}
Expand Down Expand Up @@ -174,8 +173,9 @@ function currentDocumentRegion()
}
}

interface EvaluateSelectionProvider {
evaluateString(document: vscode.TextDocument, range: vscode.Selection): vscode.ProviderResult<EvaluateSelectionRequest.EvaluateSelectionResult>;
interface EvaluateSelectionProvider
{
evaluateString(document: vscode.TextDocument, range: vscode.Selection, context: SuperColliderContext): vscode.ProviderResult<EvaluateSelectionRequest.EvaluateSelectionResult>;
}

export function registerEvaluateProvider(context: SuperColliderContext, provider): vscode.Disposable
Expand All @@ -188,10 +188,10 @@ export function registerEvaluateProvider(context: SuperColliderContext, provider
(inputRange) => {
const document = vscode.window.activeTextEditor.document;
const range = (inputRange != null)
? new vscode.Selection(
new vscode.Position(inputRange['start']['line'], inputRange['start']['character']),
new vscode.Position(inputRange['end']['line'], inputRange['end']['character']))
: currentDocumentSelection();
? new vscode.Selection(
new vscode.Position(inputRange['start']['line'], inputRange['start']['character']),
new vscode.Position(inputRange['end']['line'], inputRange['end']['character']))
: currentDocumentSelection();

if (range !== null)
{
Expand Down Expand Up @@ -228,11 +228,9 @@ export function registerEvaluateProvider(context: SuperColliderContext, provider
})
}

interface EvaluateSelectionOptions extends WorkDoneProgressOptions {
}
type EvaluateSelectionOptions = WorkDoneProgressOptions;

interface EvaluateSelectionRegistrationOptions extends EvaluateSelectionOptions, TextDocumentRegistrationOptions, StaticRegistrationOptions {
}
type EvaluateSelectionRegistrationOptions = EvaluateSelectionOptions&TextDocumentRegistrationOptions&StaticRegistrationOptions;

namespace EvaluateSelectionRequest
{
Expand All @@ -252,7 +250,7 @@ export interface EvaluateSelectionResult {
export const type = new ProtocolRequestType<EvaluateSelectionParams, EvaluateSelectionResult, never, void, EvaluateSelectionRegistrationOptions>(method);
}

async function evaluateString(client: vscodelc.BaseLanguageClient, document: vscode.TextDocument, range: Range): Promise<EvaluateSelectionRequest.EvaluateSelectionResult>
async function evaluateString(client: vscodelc.BaseLanguageClient, document: vscode.TextDocument, range: Range, context: SuperColliderContext): Promise<EvaluateSelectionRequest.EvaluateSelectionResult>
{
const activeTextEditor = vscode.window.activeTextEditor;

Expand All @@ -262,30 +260,38 @@ async function evaluateString(client: vscodelc.BaseLanguageClient, document: vsc
const uri = vscode.Uri.file(document.fileName);
const docIdentifier = vscodelc.TextDocumentIdentifier.create(uri.toString());

let finishFunc = onStartEvaluate(activeTextEditor, range);
let finishFunc = onStartEvaluate(activeTextEditor, range, context.codeEvaluationSettings);

const result = client.sendRequest(EvaluateSelectionRequest.type, {
textDocument : docIdentifier,
sourceCode : activeTextEditor.document.getText(range)
});

result.then((result) => {
const prefix = '⇒ ';

if (result.result !== undefined)
{
const prefix = '⇒ ';
vscode.window.showInformationMessage(prefix + result.result);
if (context.codeEvaluationSettings.showMessage)
{
vscode.window.showInformationMessage(prefix + result.result);
}
finishFunc(result.result, false);
}
else if (result.compileError !== undefined)
{
const prefix = '⇏ ';
vscode.window.showErrorMessage(prefix + result.compileError);
if (context.codeEvaluationSettings.showMessage)
{
vscode.window.showErrorMessage(prefix + result.compileError);
}
finishFunc(result.compileError, true);
}
else if (result.error !== undefined)
{
const prefix = '⇏ ';
vscode.window.showErrorMessage(prefix + result.error);
if (context.codeEvaluationSettings.showMessage)
{
vscode.window.showErrorMessage(prefix + result.error);
}
finishFunc(result.error, true);
}
});
Expand All @@ -299,7 +305,7 @@ export class EvaluateSelectionFeature extends TextDocumentFeature<EvaluateSelect
{
_context: SuperColliderContext;

constructor(client, context: SuperColliderContext)
constructor(client: vscodelc.BaseLanguageClient, context: SuperColliderContext)
{
super(client, EvaluateSelectionRequest.type);
this._context = context;
Expand All @@ -326,13 +332,13 @@ export class EvaluateSelectionFeature extends TextDocumentFeature<EvaluateSelect
{
const provider: EvaluateSelectionProvider = {
evaluateString : (document: vscode.TextDocument, range: vscode.Selection) => {
const client = this._client;
const client = this._client;

const provideEvaluateSelection = (document: vscode.TextDocument, range: vscode.Selection) => {
return evaluateString(client, document, range);
const provideEvaluateSelection = (document: vscode.TextDocument, range: vscode.Selection, context: SuperColliderContext) => {
return evaluateString(client, document, range, context);
};

return provideEvaluateSelection(document, range);
return provideEvaluateSelection(document, range, this._context);
}
};

Expand Down
28 changes: 17 additions & 11 deletions src/context.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,24 +33,30 @@ export class SuperColliderContext implements Disposable
sclangProcess: cp.ChildProcess;
lspTokenPath: string;
outputChannel: vscode.OutputChannel;
codeEvaluationSettings: {
blinkDuration: number;
showMessage : boolean;
};

processOptions()
{
const configuration = workspace.getConfiguration()
const configuration = workspace.getConfiguration();

const sclangPath = configuration.get<string>('supercollider.sclang.cmd')
const sclangArgs = configuration.get<Array<string>>('supercollider.sclang.args')
const sclangEnv = configuration.get<Object>('supercollider.sclang.environment')
const sclangConfYaml = configuration.get<string>('supercollider.sclang.confYaml')
const sclangPath = configuration.get<string>('supercollider.sclang.cmd');
const sclangArgs = configuration.get<Array<string>>('supercollider.sclang.args');
const sclangEnv = configuration.get<Object>('supercollider.sclang.environment');
const sclangConfYaml = configuration.get<string>('supercollider.sclang.confYaml');

const readPort = configuration.get<number>('supercollider.sclang.lspReadPort')
const writePort = configuration.get<number>('supercollider.sclang.lspWritePort')
const readPort = configuration.get<number>('supercollider.sclang.lspReadPort');
const writePort = configuration.get<number>('supercollider.sclang.lspWritePort');

this.codeEvaluationSettings = configuration.get('supercollider.codeEvaluation')

let env = process.env;
env['SCLANG_LSP_ENABLE'] = '1';
env['SCLANG_LSP_SERVERPORT'] = readPort.toString();
env['SCLANG_LSP_CLIENTPORT'] = writePort.toString();
env['SCLANG_LSP_LOGLEVEL'] = configuration.get<string>('supercollider.languageServerLogLevel')
env['SCLANG_LSP_LOGLEVEL'] = configuration.get<string>('supercollider.languageServerLogLevel');

let spawnOptions: cp.SpawnOptions = {
env : Object.assign(env, sclangEnv)
Expand Down Expand Up @@ -113,7 +119,7 @@ export class SuperColliderContext implements Disposable
let sclangProcess = this.sclangProcess = this.createProcess();

const serverOptions: ServerOptions = function() {
// @TODO what if terminal launch fails?
// @TODO what if terminal launch fails?

const configuration = workspace.getConfiguration()
const readPort = configuration.get<number>('supercollider.sclang.lspReadPort')
Expand All @@ -135,10 +141,10 @@ export class SuperColliderContext implements Disposable
res(streamInfo);
}
outputChannel.append(string);
});
});

sclangProcess.on('exit', (code, signal) => { sclangProcess = null; });
});
});
});
};

Expand Down