ladybird/Documentation/VSCodeConfiguration.md
kleines Filmröllchen 01b38ffc9a Documentation: Add configuration information for VSCode
This is a combination of the efforts of multiple people and hours of
pain trying to configure VSCode properly. This should give a good
baseline for anyone trying to develop Serenity with VSCode.

Co-authored-by: Hendiadyoin1 <leon2002.la@gmail.com>
2021-08-27 23:37:39 +01:00

9.9 KiB

Visual Studio Code Project Configuration

Visual Studio Code does not work optimally for Serenity development, and there's a bunch of configuring and fiddling around you'll have to do.

The WSL Remote extension allows you to use VSCode in Windows while using the normal WSL workflow. This works surprisingly well, but for code comprehension speed you should put the Serenity directory on your WSL root partition.

Note on CMake

The CMake Tools plugin for VSCode does not work with projects that don't accept a CMAKE_BUILD_TYPE. See also this CMake Tools issue; an appropriate feature is planned for 1.9.0. For now, it is best to disable all CMake extensions when working on Serenity.

Code comprehension

Both C++ comprehension tools listed below report fake errors.

clangd

The official clangd extension can be used for C++ comprehension. You'll have to use the following .clangd:

CompileFlags:
  CompilationDatabase: Build/i686

Run cmake at least once for this to work. clangd has difficulty finding specific methods and types, especially with inheritance trees. Also, include errors are wrong in 90% of cases.

Microsoft C/C++ tools

These extensions can be used as-is, but you need to point them to the custom Serenity compilers. Use the following cpp-preferences to circumvent some errors:

.vscode/c_cpp_propperties.json
{
    "name": "Userspace",
    "includePath": [
        "${workspaceFolder}",
        "${workspaceFolder}/Build/i686/",
        "${workspaceFolder}/Build/i686/Userland",
        "${workspaceFolder}/Build/i686/Userland/Applications",
        "${workspaceFolder}/Build/i686/Userland/Libraries",
        "${workspaceFolder}/Build/i686/Userland/Services",
        "${workspaceFolder}/Build/i686/Root/usr/include/**",
        "${workspaceFolder}/Userland",
        "${workspaceFolder}/Userland/Libraries",
        "${workspaceFolder}/Userland/Libraries/LibC",
        "${workspaceFolder}/Userland/Libraries/LibM",
        "${workspaceFolder}/Userland/Libraries/LibPthread",
        "${workspaceFolder}/Userland/Services",
        "${workspaceFolder}/Toolchain/Local/i686/i686-pc-serenity/include/c++/**"
    ],
    "defines": [
        "DEBUG",
        "__serenity__",
    ],
    "compilerPath": "${workspaceFolder}/Toolchain/Local/i686/bin/i686-pc-serenity-g++",
    "cStandard": "c17",
    "cppStandard": "c++20",
    "intelliSenseMode": "linux-gcc-x86",
    "browse": {
        "path": [
            "${workspaceFolder}",
            "${workspaceFolder}/Build/i686/",
            "${workspaceFolder}/Build/i686/Userland",
            "${workspaceFolder}/Build/i686/Userland/Applications",
            "${workspaceFolder}/Build/i686/Userland/Libraries",
            "${workspaceFolder}/Build/i686/Userland/Services",
            "${workspaceFolder}/Build/i686/Root/usr/include/**",
            "${workspaceFolder}/Userland",
            "${workspaceFolder}/Userland/Libraries",
            "${workspaceFolder}/Userland/Libraries/LibC",
            "${workspaceFolder}/Userland/Libraries/LibM",
            "${workspaceFolder}/Userland/Libraries/LibPthread",
            "${workspaceFolder}/Userland/Services",
            "${workspaceFolder}/Toolchain/Local/i686/i686-pc-serenity/include/c++/**"
        ],
        "limitSymbolsToIncludedHeaders": true
    },
    "compileCommands": "Build/i686/compile_commands.json",
    "compilerArgs": [
        "-wall",
        "-wextra",
        "-werror"
    ]
}

Most nonsentical errors from the extension also involve not finding methods, types etc.

DSL syntax highlighting

There's a syntax highlighter extension for both IPC and GML called "SerenityOS DSL Syntax Highlight", available here or here.

Formatting

clang-format is included with the Microsoft tools (see above). The settings below include a key that makes it use the proper style. Alternatively, you can use the clang-format extension itself, which should work out of the box.

Settings

These belong in the .vscode/settings.json of Serenity.

// Excluding the generated directories keeps your file view clean and speeds up search.
"files.exclude": {
    "**/.git": true,
    "Toolchain/Local/**": true,
    "Toolchain/Tarballs/**": true,
    "Toolchain/Build/**": true,
    "Build/**": true,
    "build/**": true,
},
"search.exclude": {
    "**/.git": true,
    "Toolchain/Local/**": true,
    "Toolchain/Tarballs/**": true,
    "Toolchain/Build/**": true,
    "Build/**": true,
    "build/**": true,
},
// Force clang-format to respect Serenity's .clang-format style file.
"C_Cpp.clang_format_style": "file",
// Tab settings
"editor.tabSize": 4,
"editor.useTabStops": false,

Customization

Custom Tasks

You can create custom tasks (.vscode/tasks.json) to quickly compile Serenity. The following are two example tasks, a "just build" task and a "build and run" task for i686 that also give you error highlighting:

{
    "tasks": [
        {
            "label": "build",
            "type": "shell",
            "problemMatcher": [
                {
                    "base": "$gcc",
                    "fileLocation": [
                        "relative",
                        "${workspaceFolder}/Build/i686"
                    ]
                },
                {
                    "source": "gcc",
                    "fileLocation": [
                        "relative",
                        "${workspaceFolder}/Build/i686"
                    ],
                    "pattern": [
                        {
                            "regexp": "^([^\\s]*\\.S):(\\d*): (.*)$",
                            "file": 1,
                            "location": 2,
                            "message": 3
                        }
                    ]
                }
            ],
            "command": [
                "bash"
            ],
            "args": [
                "-c",
                "\"Meta/serenity.sh image\""
            ],
            "presentation": {
                "echo": true,
                "reveal": "always",
                "focus": false,
                "group": "build",
                "panel": "shared",
                "showReuseMessage": true,
                "clear": true
            }
        },
        {
            "label": "launch",
            "type": "shell",
            "linux": {
                "command": "bash",
                "args": [
                    "-c",
                    "\"Meta/serenity.sh run\""
                ],
                "options": {
                    "env": {
                        // Put your custom run configuration here, e.g. SERENITY_RAM_SIZE
                    }
                }
            },
            "problemMatcher": [
                {
                    "source": "Assertion Failed",
                    "fileLocation": [
                        "relative",
                        "${workspaceFolder}/Build/i686"
                    ],
                    "pattern": [
                        {
                            "regexp": "ASSERTION FAILED: (.*)$",
                            "message": 1
                        },
                        {
                            "regexp": "^((?:.*)\\.(h|cpp|c|S)):(\\d*)$",
                            "file":1,
                            "location":3
                        }
                    ]
                },
                {
                    "source": "KUBSan",
                    "owner": "cpp",
                    "fileLocation": [
                        "relative",
                        "${workspaceFolder}"
                    ],
                    "pattern": [
                        {
                            "regexp": "KUBSAN: (.*)",
                            "message": 0
                        },
                        {
                            "regexp": "KUBSAN: at ../(.*), line (\\d*), column: (\\d*)",
                            "file": 1,
                            "line": 2,
                            "column": 3
                        }
                    ]
                },
                {
                    "base": "$gcc",
                    "fileLocation": [
                        "relative",
                        "${workspaceFolder}/Build/i686"
                    ]
                },
                {
                    "source": "gcc",
                    "fileLocation": [
                        "relative",
                        "${workspaceFolder}/Build/i686"
                    ],
                    "pattern": [
                        {
                            "regexp": "^([^\\s]*\\.S):(\\d*): (.*)$",
                            "file": 1,
                            "location": 2,
                            "message": 3
                        }
                    ]
                }
            ],
            "presentation": {
                "echo": true,
                "reveal": "always",
                "group": "run",
                "focus": false,
                "panel": "shared",
                "showReuseMessage": true,
                "clear": true
            }
        },
    ]
}

This can easily be adopted into x86_64 by appending the architecture to the serenity.sh commands.

License snippet

The following snippet may be useful if you want to quickly generate a license header, put it in .vscode/serenity.code-snippets:

{
    "License": {
        "scope": "cpp,c",
        "prefix": "license",
        "body": [
            "/*",
            " * Copyright (c) $CURRENT_YEAR, ${1:Your Name} <${2:YourName@Email.com}>.",
            " *",
            " * SPDX-License-Identifier: BSD-2-Clause",
            " */"
        ],
        "description": "Licence header"
    }
}