<
From version < 10.1 >
edited by Soeren Domroes
on 2019/04/01 09:14
To version < 14.1 >
edited by Soeren Domroes
on 2019/04/01 13:56
>
Change comment: There is no comment for this version

Summary

Details

Page properties
Content
... ... @@ -16,7 +16,7 @@
16 16  
17 17  \\
18 18  
19 -The setup tasks for Modular Target will fail. Disable it after this happens and execute them again via //Help>Perform Setup Tasks//. Run //clean build//. Several pragmatics projects have error. Just close them and you will be fine.
19 +The setup tasks for Modular Target will fail. Disable it after this happens and execute them again via //Help>Perform Setup Tasks//. Open the //plug-in development// perspective. Select working sets as top level elements. Run //clean build//. Several pragmatics projects have errors. Just close them and you will be fine.
20 20  
21 21  To run the language server go to //Run Configurations// create a new //eclipse application// run configuration and select //Run an application//  and //de.cau.cs.kieler.language.server.LanguageServer//
22 22  
... ... @@ -73,14 +73,20 @@
73 73  
74 74  Install [[node 8>>url:https://nodejs.org/download/release/v8.15.0/||shape="rect"]] for windows. I personally used the {{code language="none"}}.msi{{/code}}.
75 75  
76 -Use that to install windows-build-tools:
76 +Use that to install windows-build-tools by executing the command in an administrative powershell.
77 77  
78 78  {{code}}
79 79  npm install -g windows-build-tools
80 80  {{/code}}
81 81  
82 -This installs make, gcc, g++, python and all this (I am not sure about yarn, anyway you can always install yarn the same way as in the linux description)
82 +This installs make, gcc, g++, python and all this.
83 83  
84 +Yarn can be downloaded and installed from [[here>>url:https://yarnpkg.com/lang/en/docs/install/#windows-stable||shape="rect"]].
85 +
86 +=== Known Problems in this step ===
87 +
88 +Python is not correctly registered in the path.
89 +
84 84  == ... on mac: ==
85 85  
86 86  Get a package manager, something like [[brew>>url:https://brew.sh/index_de||shape="rect"]].
... ... @@ -147,10 +147,24 @@
147 147  yarn && cd keith-app && yarn run socket
148 148  {{/code}}
149 149  
156 +//yarn// builds all the stuff. //yarn run socket// in keith-app starts the application. After an initial build via yarn you can run //yarn watch // to watch the changes in your repository. In another console you run yarn run socket in keith-app. Now refreshing your browser is enough to apply the changes.
157 +
150 150  Per default the KEITH opens on localhost:3000.
151 151  
152 152  It is required to restart the language server if KEITH is restarted, since the diagram view has a problem (since theia-sprotty is used) to reconnect after that.
153 153  
162 +=== Known issues for windows: ===
163 +
164 +nsfw.code not found: In the top level package.json exists a script called postinstall. Remove this on windows, delete the node_modules folder and rebuilt the application. This is a known issue of electron-builder.
165 +
166 +=== Known issues on mac: ===
167 +
168 +Since SWT is still used as part of the diagram synthesis (but is not relevant anymore). Since it is not called on the main thread this causes a deadlock. Therefore mac just does not work.
169 +
170 +=== Known issues: ===
171 +
172 +Refreshing the browser is not enough for the diagram to work. If the diagram is needed the language server has to be restarted before the browser is refreshed. This is a known issue in theia-sprotty.
173 +
154 154  = Developing for KEITH =
155 155  
156 156  We use java ServiceLoader to register stuff. Here is a small example how a LanguageServerExtension is registered via a ServiceLoader and how it is used:
... ... @@ -201,12 +201,139 @@
201 201  de.cau.cs.kieler.kicool.ide.language.server.KiCoolLanguageServerContribution
202 202  {{/code}}
203 203  
204 -This
224 +This is the fully qualified name of the contribution written earlier.
205 205  
226 +The language server uses all LanguageServerExtensions like this:
227 +
228 +{{code}}
229 +var iLanguageServerExtensions = <Object>newArrayList(languageServer) // list of all language server extensions
230 +for (lse : KielerServiceLoader.load(ILanguageServerContribution)) { // load all contributions
231 + iLanguageServerExtensions.add(lse.getLanguageServerExtension(injector))
232 +}
233 +{{/code}}
234 +
235 +The resulting list of implementions is used to add the extensions to the language server.
236 +
206 206  == Register an extension (on server side) ==
207 207  
208 -== Register an extension (on client side) ==
239 +See example above for ServiceLoader and initial stuff.
209 209  
210 -== How to send messages ==
241 +What is still missing are the contents of the CommandExtension implemented by the KiCoolLanguageServerExtension. This is an interface defining all additional commands. The CommandExtension looks like this.
211 211  
243 +{{code}}
244 +package de.cau.cs.kieler.kicool.ide.language.server
245 +
246 +import java.util.concurrent.CompletableFuture
247 +import org.eclipse.lsp4j.jsonrpc.services.JsonRequest
248 +import org.eclipse.lsp4j.jsonrpc.services.JsonSegment
249 +
250 +/**
251 + * Interface to the LSP extension commands
252 + *
253 + * @author really fancy name
254 + *
255 + */
256 +@JsonSegment('keith/kicool')
257 +interface CommandExtension {
258 +
259 + /**
260 + * Compiles file given by uri with compilationsystem given by command.
261 + */
262 + @JsonRequest('compile')
263 + def CompletableFuture<CompilationResults> compile(String uri, String clientId, String command, boolean inplace);
264 +
265 + /**
266 + * Build diagram for snapshot with id index for file given by uri. Only works, if the file was already compiled.
267 + */
268 + @JsonRequest('show')
269 + def CompletableFuture<String> show(String uri, String clientId, int index)
270 +
271 + /**
272 + * Returns all compilation systems which are applicable for the file at given uri.
273 + *
274 + * @param uri URI as string to get compilation systems for
275 + * @param filter boolean indicating whether compilation systems should be filtered
276 + */
277 + @JsonRequest('get-systems')
278 + def CompletableFuture<Object> getSystems(String uri, boolean filterSystems)
279 +}
280 +{{/code}}
281 +
282 +This defines three json-rpc commands: "keith/kicool/compile", "keith/kicool/show", "keith/kicool/get-systems". These are implemented in KiCoolLanguageServerExtension.
283 +
284 +== Register and calling an extension (on client side) ==
285 +
286 +Language server extension do not have to be registered on the client side. It is just called.
287 +
288 +You can send a request or a notification to the language server like this:
289 +
290 +{{code}}
291 +const lclient = await this.client.languageClient
292 +const snapshotsDescriptions: CodeContainer = await lclient.sendRequest("keith/kicool/compile", [uri, KeithDiagramManager.DIAGRAM_TYPE + '_sprotty', command,
293 + this.compilerWidget.compileInplace]) as CodeContainer
294 +// or via a thenable
295 +client.languageClient.then(lClient => {
296 +lClient.sendRequest("keith/kicool/compile").then((snapshotsDescriptions: CodeContainer) => {
297 + // very important stuff
298 +}
299 +// await is preferred, since it is shorter.
300 +{{/code}}
301 +
302 +In this example client is an instance of a language client. It is usually injected like this:
303 +
304 +{{code}}
305 +constructor(
306 + @inject(KeithLanguageClientContribution) public readonly client: KeithLanguageClientContribution
307 + // other injected classes
308 + ) {
309 + // constructor stuff
310 +}
311 +{{/code}}
312 +
313 +\\
314 +
315 +== How to make a new package for KEITH ==
316 +
317 +Clone the [[KEITH repository>>url:https://git.rtsys.informatik.uni-kiel.de/projects/KIELER/repos/keith/browse||shape="rect"]].
318 +
319 +Open the keith folder in VSCode. You are know in the keith directory in VSCode.
320 +
321 +You see something like this: TODO picture
322 +
323 +Create a new folder called keith-<your extension name>.
324 +
325 +Copy a package.json, a tslint.json, a tsconfig.json, and a src folder into the folder.
326 +
327 +Add keith-<your extension name> to workspaces in the top level package.json.
328 +
329 +Add "keith-<your extension name>(% style="color: rgb(0,0,0);" %)": (%%)"0.1.0"(% style="color: rgb(0,0,0);" %) to the dependencies in the top level package.json and the product package.json files (e.g. the package.json in keith-app).
330 +
331 +=== What is in the src directory? ===
332 +
333 +The source directory has three optional subfolders.
334 +
335 +* node: Holds all backend related classes. This does currently only exist in the [[keith-language package>>url:https://git.rtsys.informatik.uni-kiel.de/projects/KIELER/repos/keith/browse/keith-language||shape="rect"]].
336 +* common: Holds general helper methods, string constants and some data classes
337 +* browser: Holds all widgets, contribution for commands, menus, and widgets, and the frontend-extension.
338 +
339 +==== The frontend-extension ====
340 +
341 +This binds all necessary classes. Look at existing frontend extension in [[KEITH>>url:https://git.rtsys.informatik.uni-kiel.de/projects/KIELER/repos/keith/browse||shape="rect"]] or [[Theia>>url:https://github.com/theia-ide/theia/tree/master/packages||shape="rect"]] to see how this is done.
342 +
343 +==== More examples for stuff ====
344 +
345 +See [[Theia examples>>url:https://www.theia-ide.org/doc/Commands_Keybindings.html||shape="rect"]].
346 +
212 212  == How to write a widget ==
348 +
349 +There are different kinds of widgets that are commonly used in [[KEITH>>url:https://git.rtsys.informatik.uni-kiel.de/projects/KIELER/repos/keith/browse||shape="rect"]] or in existing [[Theia packages>>url:https://github.com/theia-ide/theia/tree/master/packages||shape="rect"]].
350 +
351 +* BaseWidget: Very basic
352 +* ReactWidget: A render method has to be implemented that redraws the widget on demand. Additionally several on* event methods can beimplemented.
353 +* TreeWidget: Extends the ReactWidget and draws the contents of the widget in a tree view.
354 +
355 +If a widget has a state it should implement the StatefulWidget interface, which allows to imlement a store and restore method.
356 +
357 +Look at examples in KEITH or Theia to see how this is done.
358 +
359 +\\
Confluence.Code.ConfluencePageClass[0]
Id
... ... @@ -1,1 +1,1 @@
1 -56852525
1 +56852534
URL
... ... @@ -1,1 +1,1 @@
1 -https://rtsys.informatik.uni-kiel.de/confluence//wiki/spaces/KIELER/pages/56852525/Running KEITH
1 +https://rtsys.informatik.uni-kiel.de/confluence//wiki/spaces/KIELER/pages/56852534/Running KEITH