Skip to content
This repository was archived by the owner on Jun 22, 2024. It is now read-only.

Commit 24038ec

Browse files
committed
Fixes code format and respect tabSize settings #19
1 parent 9d55439 commit 24038ec

File tree

7 files changed

+73
-60
lines changed

7 files changed

+73
-60
lines changed

CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
# Changelog
22

3+
## 2.3.2
4+
* Code format did fail #19
5+
* Code format always indented by 4 spaces. Now configurable.
6+
7+
### Tabwidth
8+
By default `editor.tabSize` will be used. As this setting is global and affects all code, you can optionally override it using `"[swift]": { "tabSize": 2 }`.
9+
310
## 2.3.1
411
* Accidentially logged SourceKit's `key.kind` and `key.description`
512
* Removed unused config `editor.quickSuggestions`

package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
"url": "https://github.com/vknabel"
99
},
1010
"license": "Apache-2.0",
11-
"version": "2.3.1",
11+
"version": "2.3.2",
1212
"publisher": "vknabel",
1313
"icon": "icons/icon.png",
1414
"galleryBanner": {
@@ -146,9 +146,10 @@
146146
},
147147
"devDependencies": {
148148
"@types/bunyan": "latest",
149+
"@types/js-yaml": "^3.11.1",
149150
"@types/node": "latest",
150151
"@types/xml-js": "^1.0.0",
151-
"js-yaml": "^3.7.0",
152+
"js-yaml": "^3.11.0",
152153
"mocha": "^2.3.3",
153154
"pegjs": "^0.10.0",
154155
"typescript": "^2.0.0",

projects/Watch/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
.build

src/clientMain.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ export function activate(context: ExtensionContext) {
5959
// Register the server for plain text documents
6060
documentSelector: ['swift'],
6161
synchronize: {
62-
configurationSection: 'swift',
62+
configurationSection: ['swift', 'editor', '[swift]'],
6363
// Notify the server about file changes to '.clientrc files contain in the workspace
6464
fileEvents: workspace.createFileSystemWatcher('**/*.swift')
6565
},

src/server/server.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ connection.onInitialize((params: InitializeParams, cancellationToken): Initializ
131131
// signatureHelpProvider: {
132132
// triggerCharacters: ['[', ',']
133133
// },
134-
// We're prividing completions.
134+
// We're providing completions.
135135
completionProvider: {
136136
resolveProvider: false,
137137
triggerCharacters: [
@@ -147,13 +147,18 @@ connection.onInitialize((params: InitializeParams, cancellationToken): Initializ
147147
// The settings interface describe the server relevant settings part
148148
interface Settings {
149149
swift: any;
150+
editor: {
151+
tabSize?: number
152+
},
153+
'[swift]': {}
150154
}
151155

152156

153157
//external
154158
export let sdeSettings: any;
155159
export let swiftDiverBinPath: string = null;
156160
export let maxBytesAllowedForCodeCompletionResponse: number = 0;
161+
export let editorSettings: Settings['editor'] = {};
157162
//internal
158163
export let skProtocolPath = null
159164
export let skProtocolProcessAsShellCmd = false
@@ -165,7 +170,8 @@ let shellPath = null
165170
connection.onDidChangeConfiguration((change) => {
166171
trace("-->onDidChangeConfiguration")
167172
const settings = <Settings>change.settings
168-
sdeSettings = settings.swift;//FIXME configs only accessed via the language id?
173+
sdeSettings = settings.swift;
174+
editorSettings = { ...settings.editor, ...settings['[swift]'] };
169175

170176
//FIXME does LS client support on-the-fly change?
171177
maxNumProblems = sdeSettings.diagnosis.max_num_problems
@@ -490,8 +496,6 @@ connection.onDefinition(({textDocument, position}): Promise<Definition> => {
490496
});
491497
})
492498

493-
494-
495499
connection.onDocumentFormatting(({textDocument, options}): Promise<TextEdit[]> => {
496500
const document: TextDocument = documents.get(textDocument.uri);
497501
const srcPath = fromDocumentUri(document);

src/server/sourcekites.ts

Lines changed: 46 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ import {
77
} from 'vscode-languageserver'
88

99
import * as stream from 'stream'
10+
import * as yaml from 'js-yaml'
1011
import { ChildProcess } from "child_process";
12+
import { editorSettings } from './server';
1113

1214
let skProtocolProcess: ChildProcess | null = null
1315
let skeHandler: SourcekiteResponseHandler | null = null
@@ -144,16 +146,16 @@ let reqCount = 0 //FIXME
144146

145147
type RequestType = "codecomplete" | "cursorinfo" | "demangle" | "editor.open" | "editor.formattext"
146148

147-
function parseSkResponse(resp: string): any {
148-
return JSON.parse(jsonify(resp))
149-
}
150-
151149
function pluck<T, K extends keyof T>(prop: K): (ofTarget: T) => T[K] {
152150
return target => target[prop];
153151
}
154152

155-
function typedResponse(request: string, requestType: RequestType,
156-
extraState: any = null, retries = 0): Promise<string> {
153+
function typedResponse<T>(request: string, requestType: RequestType,
154+
extraState: any = null, retries = 0): Promise<T> {
155+
function parseSkResponse(resp: string): any {
156+
return yaml.safeLoad(resp);
157+
}
158+
157159
server.trace('to write request: ', request)
158160
const rid = reqCount++
159161
skProtocolProcess.stdin.write(rid + "\n")
@@ -168,7 +170,7 @@ function typedResponse(request: string, requestType: RequestType,
168170
restartSourcekite();
169171
return typedResponse(request, requestType, extraState, retries);
170172
}
171-
})
173+
}).then(parseSkResponse)
172174
}
173175

174176
function request(
@@ -225,13 +227,12 @@ function request(
225227
//== codeComplete
226228
export function codeComplete(srcText: string, srcPath: string, offset: number): Promise<any> {
227229
return request("codecomplete", srcText, srcPath, offset)
228-
.then(parseSkResponse).then(pluck("key.results"));
230+
.then(pluck("key.results"));
229231
}
230232

231233
//== cursorInfo
232234
export function cursorInfo(srcText: string, srcPath: string, offset: number): Promise<any> {
233-
return request("cursorinfo", srcText, srcPath, offset)
234-
.then(parseSkResponse);
235+
return request("cursorinfo", srcText, srcPath, offset);
235236
}
236237

237238
//== demangle
@@ -243,8 +244,8 @@ export function demangle(...demangledNames: string[]): Promise<any> {
243244
}
244245
245246
`
246-
return typedResponse(request, "demangle")
247-
.then(parseSkResponse).then(pluck("key.results"))
247+
return typedResponse<any>(request, "demangle")
248+
.then(pluck("key.results"))
248249
}
249250

250251

@@ -260,7 +261,7 @@ export function editorFormatText(
260261
editorOpen(srcPath, srcText, false, false, true)
261262
.then((v) => {
262263
// discard v
263-
let p = requestEditorFormatText(srcPath, lineStart, 1, document)
264+
let p = requestEditorFormatText({ file: srcPath, line: lineStart, document })
264265

265266
//TODO async-await
266267
function nextp(fts: FormatTextState) {
@@ -269,7 +270,7 @@ export function editorFormatText(
269270
let sPos: Position = { line: fts.line, character: 0 }
270271
let ePos: Position = document.positionAt(
271272
document.offsetAt({ line: fts.line + 1, character: 0 }) - 1)
272-
requestEditorFormatText(srcPath, fts.line + 1, 1, document)
273+
requestEditorFormatText({ file: srcPath, line: fts.line + 1, document })
273274
.then(nextp)
274275
.catch((err) => {
275276
reject(err)
@@ -307,52 +308,61 @@ function editorOpen(
307308
}
308309
309310
`
310-
return typedResponse(request, "editor.open")
311-
.then(parseSkResponse)
311+
return typedResponse(request, "editor.open");
312312
}
313313

314314
interface FormatTextState {
315315
line: number,
316316
textEdit: TextEdit
317317
}
318318

319-
function requestEditorFormatText(
320-
keyName: string,
321-
keyLine: number,
322-
keyLength: number,//FIXME unuseful now
319+
interface SkFormatTextResponse {
320+
'key.line': number;
321+
'key.length': number;
322+
'key.sourcetext': string;
323+
}
324+
325+
function requestEditorFormatText(options: {
326+
file: string,
327+
line: number,
323328
document: TextDocument
324-
): Promise<FormatTextState> {
329+
}): Promise<FormatTextState> {
330+
const indentationOptions = !editorSettings.tabSize
331+
? ''
332+
: `key.editor.format.options: {
333+
key.editor.format.indentwidth: ${editorSettings.tabSize},
334+
key.editor.format.tabwidth: ${editorSettings.tabSize},
335+
key.editor.format.usetabs: 0
336+
}`;
325337
let request = `{
326338
key.request: source.request.editor.formattext,
327-
key.name: "${keyName}",
328-
key.line: ${keyLine},
329-
key.length: ${keyLength},
339+
key.name: "${options.file}",
340+
key.line: ${options.line},
341+
key.length: 1,
342+
${indentationOptions}
330343
}
331344
332345
`;
333-
let firstStartPos: Position = { line: keyLine - 1, character: 0 }
346+
let firstStartPos: Position = { line: options.line - 1, character: 0 }
334347
let firstEndPos: Position =
335-
keyLine != document.lineCount ?
336-
document.positionAt(
337-
document.offsetAt({ line: keyLine, character: 0 }) - 1) :
338-
document.positionAt(
339-
document.offsetAt({ line: document.lineCount, character: 0 }))
348+
options.line != options.document.lineCount ?
349+
options.document.positionAt(
350+
options.document.offsetAt({ line: options.line, character: 0 }) - 1) :
351+
options.document.positionAt(
352+
options.document.offsetAt({ line: options.document.lineCount, character: 0 }))
340353
const extraState = {
341-
keyLine: keyLine,
354+
keyLine: options.line,
342355
lineRange: { start: firstStartPos, end: firstEndPos }//NOTE format req is 1-based
343356
}
344357
return typedResponse(request, "editor.formattext")
345-
.then((resp: string) => {
358+
.then((resp: SkFormatTextResponse) => {
346359
const keyLine = extraState.keyLine
347360
const lineRange = extraState.lineRange
348-
let offSetEnd = resp.lastIndexOf("\"");
349-
let offSetStart = resp.indexOf("\"", resp.lastIndexOf("key.sourcetext:")) + 1
350-
let lineText = resp.substring(offSetStart, offSetEnd)
351361
return {
352362
line: keyLine,
353363
textEdit: {
354364
range: lineRange,
355-
newText: JSON.parse(`"${lineText}"`) //NOTE convert back, silly...
365+
newText: resp['key.sourcetext']
356366
}
357367
}
358368
})
@@ -373,17 +383,3 @@ function debugLog(msg: string) {
373383
function booleanToInt(v: boolean): Number {
374384
return v ? 1 : 0
375385
}
376-
377-
const cutOffPrefix = "key.results:";
378-
function cutOffResponse(s: string): string {
379-
s = s.substring(s.indexOf(cutOffPrefix) + cutOffPrefix.length, s.length)
380-
s = s.substring(0, s.lastIndexOf("key.kind:"))
381-
s = s.substring(0, s.lastIndexOf(",")) + "]"
382-
return jsonify(s);
383-
}
384-
385-
function jsonify(s: string): string {
386-
return s
387-
.replace(/(key\.[a-z_.]+):/g, '"$1":')
388-
.replace(/(source\.[a-z_.]+),/g, '"$1",')
389-
}

yarn.lock

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@
88
dependencies:
99
"@types/node" "*"
1010

11+
"@types/js-yaml@^3.11.1":
12+
version "3.11.1"
13+
resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-3.11.1.tgz#ac5bab26be5f9c6f74b6b23420f2cfa5a7a6ba40"
14+
1115
"@types/node@*", "@types/node@latest":
1216
version "8.0.51"
1317
resolved "https://registry.yarnpkg.com/@types/node/-/node-8.0.51.tgz#b31d716fb8d58eeb95c068a039b9b6292817d5fb"
@@ -928,9 +932,9 @@ [email protected]:
928932
commander "0.6.1"
929933
mkdirp "0.3.0"
930934

931-
js-yaml@^3.7.0:
932-
version "3.10.0"
933-
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc"
935+
js-yaml@^3.11.0:
936+
version "3.11.0"
937+
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.11.0.tgz#597c1a8bd57152f26d622ce4117851a51f5ebaef"
934938
dependencies:
935939
argparse "^1.0.7"
936940
esprima "^4.0.0"

0 commit comments

Comments
 (0)