Changes for page Running KEITH
Last modified by Richard Kreissig on 2023/09/14 08:48
Change comment:
There is no comment for this version
Summary
-
Page properties (1 modified, 0 added, 0 removed)
-
Objects (1 modified, 0 added, 0 removed)
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 - ==Registeranextension(onclientside)==239 +See example above for ServiceLoader and initial stuff. 209 209 210 - ==Howtosend 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 -568525 251 +56852534 - URL
-
... ... @@ -1,1 +1,1 @@ 1 -https://rtsys.informatik.uni-kiel.de/confluence//wiki/spaces/KIELER/pages/568525 25/Running KEITH1 +https://rtsys.informatik.uni-kiel.de/confluence//wiki/spaces/KIELER/pages/56852534/Running KEITH