Commit Graph

309 Commits

Author SHA1 Message Date
Gunnar Beutner
52054eb922 UE: Make sure we return the right values for get{peer,sock}name
These two functions didn't previously return error codes correctly and
would crash when an invalid address buffer was specified.
2021-05-17 13:32:19 +02:00
Gunnar Beutner
89956cb0d6 Kernel+Userspace: Implement the accept4() system call
Unlike accept() the new accept4() system call lets the caller specify
flags for the newly accepted socket file descriptor, such as
SOCK_CLOEXEC and SOCK_NONBLOCK.
2021-05-17 13:32:19 +02:00
Gunnar Beutner
529f605ac8 UE: Make sure the buffers for get{sock,peer}name() are large enough
Previously struct sockaddr was used which isn't guaranteed to be
large enough to hold the socket address get{sock,peer}name() returns.

Also, the addrlen argument was initialized incorrectly and should
instead use the address length specified by the caller.
2021-05-17 13:32:19 +02:00
Itamar
400d3ddb08 LanguageServers: Rename AutoCompleteEngine => CodeComprehensionEngine
This feels like a better name since the "autocomplete engine" can, in
addition to providing autocomplete suggestions, also find declarations
of symbols and report back the symbols that are defined in a document.

Also, Cpp/ParserAutoComplete has been renamed to CppComprehensionEngine
and Shell/AutoComplete has been renamed to ShellComprehensionEngine.
2021-05-16 16:39:21 +02:00
Itamar
b1531b78f6 HackStudio+CppLanguageServer: Remove lexer-based autocomplete engine
The parser-based autocomplete engine is at a point where it's stable
enough that I don't think there's a need for the lexer-based
alternative anymore.
2021-05-16 16:39:21 +02:00
Daniel Bertalan
be519022c3 LibVT: Implement new ANSI escape sequence parser
This commit replaces the former, hand-written parser with a new one that
can be generated automatically according to a state change diagram.

The new `EscapeSequenceParser` class provides a more ergonomic interface
to dealing with escape sequences. This interface has been inspired by
Alacritty's [vte library](https://github.com/alacritty/vte/).

I tried to avoid changing the application logic inside the `Terminal`
class. While this code has not been thoroughly tested, I can't find
regressions in the basic command line utilities or `vttest`.

`Terminal` now displays nicer debug messages when it encounters an
unknown escape sequence. Defensive programming and bounds checks have
been added where we access parameters, and as a result, we can now
endure 4-5 seconds of `cat /dev/urandom`. :D

We generate EscapeSequenceStateMachine.h when building the in-kernel
LibVT, and we assume that the file is already in place when the userland
library is being built. This will probably cause problems later on, but
I can't find a way to do it nicely.
2021-05-16 11:50:56 +02:00
Daniel Bertalan
22195d965f DevTools: Add StateMachineGenerator utility
This program turns a description of a state machine that takes its input
byte-by-byte into C++ code. The state machine is described in a custom
format as specified below:

```
// Comments are started by two slashes, and cause the rest of the line
// to be ignored

@name ExampleStateMachine // sets the name of the generated class
@namespace Test           // sets the namespace (optional)
@begin Begin              // sets the state the parser will start in

// The rest of the file contains one or more states and an optional
// @anywhere directive. Each of these is a curly bracket delimited set
// of state transitions. State transitions contain a selector, the
// literal "=>" and a (new_state, action) tuple. Examples:
//     0x0a => (Begin, PrintLine)
//     [0x00..0x1f] => (_, Warn)      // '_' means no change
//     [0x41..0x5a] => (BeginWord, _) // '_' means no action

// Rules common to all states. These take precedence over rules in the
// specific states.
@anywhere {
    0x0a         => (Begin, PrintLine)
    [0x00..0x1f] => (_, Warn)
}

Begin {
    [0x41..0x5a] => (Word, _)
    [0x61..0x7a] => (Word, _)
    // For missing values, the transition (_, _) is implied
}

Word {
    // The entry action is run when we transition to this state from a
    // *different* state. @anywhere can't have this
    @entry IncreaseWordCount
    0x09 => (Begin, _)
    0x20 => (Begin, _)

    // The exit action is run before we transition to any *other* state
    // from here. @anywhere can't have this
    @exit EndOfWord
}
```

The generated code consists of a single class which takes a
`Function<Action, u8>` as a parameter in its constructor. This gets
called whenever an action is to be done. This is because some input
might not produce an action, but others might produce up to 3 (exit,
state transition, entry). The actions allow us to build a more
advanced parser over the simple state machine.

The sole public method, `void advance(u8)`, handles the input
byte-by-byte, managing the state changes and requesting the appropriate
Action from the handler.

Internally, the state transitions are resolved via a lookup table. This
is a bit wasteful for more complex state machines, therefore the
generator is designed to be easily extendable with a switch-based
resolver; only the private `lookup_state_transition` method needs to be
re-implemented.

My goal for this tool is to use it for implementing a standard-compliant
ANSI escape sequence parser for LibVT, as described on
<https://vt100.net/emu/dec_ansi_parser>
2021-05-16 11:50:56 +02:00
Itamar
35d28b29b3 CppLanguageServer: Fix syntax of a test case program 2021-05-15 23:28:50 +02:00
Itamar
c54238f65c CppLanguageServer: Make autocomplete logic consider scopes
When returning autocomplete suggestions, we now consider the scope of
the name that is being completed.

For example, when requested to complete an expression like
'MyNamespace::', we will only suggest things that are in the
'MyNamespace' namespace.

This commit also has some general refactoring of the autocomplete
logic.
2021-05-15 23:28:50 +02:00
Itamar
9408013177 CppLanguageServer: Only re-create DocumentData in file_opened if needed 2021-05-15 23:28:50 +02:00
Itamar
f9b8e9c01c CppLanguageServer: Autocomplete namespaces 2021-05-15 23:28:50 +02:00
Itamar
f89f4af0b3 CppLanguageServer: Don't suggest inaccessible declarations
Previously, declarations that are not available in the global
namespace, such as member functions of a class, would also appear in
the autocomplete suggestions list.

To fix this, we now only recurse into scopes of namespaces and classes
when fetching declarations if we want to retrieve all the available
declarations in the document (For the use of Locator & ClassView).
2021-05-15 23:28:50 +02:00
Ömer Kurttekin
e0a68d4b6e
HackStudio: Pledge "fattr"
HackStudio's pledges recently tightened due to changes in
Core::EventLoop. However, it still needs the fattr pledge to be able to
create a new project and set its permissions.
2021-05-15 13:00:23 +01:00
Jean-Baptiste Boric
9853a4393c IPCCompiler: Fix declaration of static functions 2021-05-14 22:24:02 +02:00
Andreas Kling
3ed5a73ede Profiler: Mark model columns as non-sortable
This removes the ability to click on the column headers to resort.
Resorting didn't do anything anyway.
2021-05-14 17:17:17 +02:00
Itamar
6329e9fce6 LanguageServer/Cpp: Add tests
The Cpp LanguageServer tests can be run with: CppLanguageServer -t

The tests now only cover some very simple autocomplete and
"find declaration" use cases, but it's a start :)
2021-05-14 13:27:47 +02:00
Itamar
e9fc5d6cc3 LanguageServers: Allow set_declarations_of_document callback to be null 2021-05-14 13:27:47 +02:00
Itamar
545b6af305 LanguageServers/FileDB: Allow m_project_root to be null 2021-05-14 13:27:47 +02:00
Itamar
c49cf23a86 LanguageServers: Remove ClientConnection dependency
We now no longer need to provide a ClientConnection object to construct
AutoCompleteEngine.
2021-05-14 13:27:47 +02:00
Andreas Kling
6210d2612e Profiler: Avoid JsonArray copying during perfcore parsing
Use JsonObject::get_ptr() to access array values without copying them.
2021-05-14 11:38:35 +02:00
Brian Gianforcaro
c63761a341
Profiler: Avoid copies / String construction when parsing profile (#7096)
Use sv literal suffix to construct StringViews at compile time,
and make sure to reference array items by const reference.
2021-05-14 10:21:25 +02:00
Gunnar Beutner
c41f13f10b Kernel+Profiler: Track lost time between profiler timer ticks
We can lose profiling timer events for a few reasons, for example
disabled interrupts or system slowness. This accounts for lost
time between CPU samples by adding a field lost_samples to each
profiling event which tracks how many samples were lost immediately
preceding the event.
2021-05-14 00:35:57 +02:00
Gunnar Beutner
d6b3513aab Profiler: Let the user ignore context switches
Now that the profiling timer is independent from the scheduler the
user will get quite a few CPU samples from "within" the scheduler.
These events are less useful when just profiling a user-mode process
rather than the whole system. This patch adds an option to Profiler to
hide these events.
2021-05-14 00:35:57 +02:00
Gunnar Beutner
c534f176bc Profiler: Add histogram for sample counts
Previously Profiler would use the stack depth to draw the timeline
graphs. This is not an accurate representation of whether a thread
is "busy" or not. Instead this updates the timelines to use the
sample count.
2021-05-14 00:35:57 +02:00
Andreas Kling
90e31b4f39 Inspector: Don't check that target has pledged "accept"
This check only existed to prevent crashing the target process back
when programs were listening for incoming Inspector connections.

Now that we talk to InspectorServer instead, and it already has a
communication channel with the target, this is no longer an issue.
2021-05-13 23:28:40 +02:00
Andreas Kling
31d4bcf5bf Userland: Tighten a *lot* of pledges! :^)
Since applications using Core::EventLoop no longer need to create a
socket in /tmp/rpc/, and also don't need to listen for incoming
connections on this socket, we can remove a whole bunch of pledges!
2021-05-13 23:28:40 +02:00
Andreas Kling
dc25a4e249 LibCore+Inspector: Reverse the direction of Inspector connections
Core::EventLoop now makes an outbound connection to InspectorServer
instead of listening for incoming connections on a /tmp/rpc/PID socket.

This has many benefits, for example:
- We no longer keep an open listening socket in most applications
- We stop leaking socket files in /tmp/rpc
- We can tighten the pledges in many programs (patch coming)
2021-05-13 23:28:40 +02:00
Andreas Kling
0a75ee29da IPCCompiler: Add "u64" and "i64" to the list of primitive types 2021-05-13 23:28:40 +02:00
sin-ack
2159f90e00 Userland+LibCore: Update FileWatcher + its users for InodeWatcher 2.0
With the new InodeWatcher API, the old style of creating a watcher per
inode will no longer work.  Therefore the FileWatcher API has been
updated to support multiple watches, and its users have also been
refactored to the new style.  At the moment, all operations done on a
(Blocking)FileWatcher return Result objects, however, this may be
changed in the future if it becomes too obnoxious. :^)

Co-authored-by: Gunnar Beutner <gunnar@beutner.name>
2021-05-12 22:38:20 +02:00
Linus Groh
91eda22208 Everywhere: Add Alt shortcuts to remaining top-level menus
Not sure why some menus did have one and others didn't, even in the
same application - now they all do. :^)
I added character shortcuts to some menu actions as well.
2021-05-12 18:09:42 +01:00
Linus Groh
ff1d3f53c4 Everywhere: Rename app_menu to file_menu, continued
These were missed in 4b0098e.
2021-05-12 17:50:48 +01:00
Ali Mohammad Pur
a91a49337c LibCore+Everywhere: Move OpenMode out of IODevice
...and make it an enum class so people don't omit "OpenMode".
2021-05-12 11:00:45 +01:00
Andreas Kling
233a9554a5 HackStudio: Tweak Files/Classes tab views
Put a bit of padding around the views, and retitle the "ClassView" tab
to simply "Classes".
2021-05-10 13:45:49 +02:00
Andreas Kling
563d3bdcc9 HackStudio: Use is<GitWidget>() instead of comparing class_name() 2021-05-10 13:45:49 +02:00
Andreas Kling
0126c81a7f HackStudio: Remove the visual form editor
Okay we've tried this twice now, and nobody ends up working on it.
Meanwhile, more and more people are using GML, and I think it's safe
to say that GML is the future of GUI development here.

So let's get rid of the old form editor from HackStudio and pave the
way for integrating GML editing into the IDE instead. :^)
2021-05-10 12:43:34 +02:00
Itamar
5c19a48b95 CppLanguageServer: Cache declarations from headers in every document
Previously, to get the globally available declarations in a document
(including declarations from headers), we would have to recursively
walk the #include tree and get the declarations of each included
document.

To improve upon this, we now store a HashTable of globally available
declaration from included header files in each document, and populate
it when we first process the document.

Before this, invoking simple autocomplete actions in code documents
that had a very large #include tree (e.g when <LibGUI/Widget.h> was
included) hang the CppLanguageServer process and used 100% CPU until
the process ran out of memory.

Now, the autocomplete request in that situation returns immediately :^)
2021-05-09 20:58:27 +02:00
Itamar
c85775d9f5 CppLanguageServer: Call Parser::parse() inside create_document_data() 2021-05-09 20:58:27 +02:00
Itamar
5c42dc854d LibCpp: Rename m_definitions=>m_preprocessor_definitions 2021-05-09 20:58:27 +02:00
Itamar
de9be7cd70 LanguageServers: Fix incorrect use of adopt_ref in FileDB::get()
This fixes a bug introduced in c13d763 that caused the LanguageServer
process to crash whenever a file was edited in HackStudio.
2021-05-09 20:58:27 +02:00
Brendan Coles
57c96ce501 UserspaceEmulator: Allow running executables not in PATH 2021-05-09 09:39:40 +02:00
Andreas Kling
244665d99c LibGUI: Some tweaks for TextEditor's will-execute-command virtual
Renamed the virtual from "on_edit_action" to "will_execute" so it
doesn't clash with our convention for Function hook names.

Also tighten the parameter type to GUI::TextDocumentUndoCommand
since that's the only kind of command it will receive.
2021-05-08 22:17:50 +02:00
Itamar
8a01167c7d AK: Add missing GenericTraits<NonnullRefPtr>
This enables us to use keys of type NonnullRefPtr in HashMaps and
HashTables.

This commit also includes fixes in various places that used
HashMap<T, NonnullRefPtr<U>>::get() and expected to get an
Optional<NonnullRefPtr<U>> and now get an Optional<U*>.
2021-05-08 18:10:56 +02:00
Itamar
77d462426b HackStudio: Remove redundant insertion to m_open_files
previous_open_project_file already exists in m_open_files under the
active_file() key.
2021-05-08 18:10:56 +02:00
Andreas Kling
ee19f7c0aa LibGUI: Use UndoStack::on_state_change inside TextDocument/TextEditor
Have TextDocument listen for state changes on the internal undo stack,
and forward those to all clients via a new virtual function.

This simplifies updating the can_undo / can_redo states of TextEditor.
2021-05-08 13:49:34 +02:00
Gunnar Beutner
eed6ce8b8b Profiler: Fix scrolling behavior
When resizing the timeline view the timelines should scroll to the
bottom when the resize operation reveals space that is beyond the
view.
2021-05-08 09:55:24 +02:00
Gunnar Beutner
210d2d270d Profiler: Let the user select more than one process 2021-05-08 09:53:53 +02:00
Carlos César Neves Enumo
325d9445fd Profiler: Migrate mouse events to TimelineView
This change allows for continuous mouse events when hovering the
layout spaces between tracks.
2021-05-08 09:53:06 +02:00
Carlos César Neves Enumo
99f141522a Profiler: Fix timeline wrong initial horizontal position
Just after launching the app, when hovering the timeline, it would
start at Time: 2000ms. It fixes itself after scrolling.
2021-05-08 09:53:06 +02:00
Gunnar Beutner
b25eba10d2 Profiler: Make the timeline resizable
This just moves the timeline and the tab widget into
a horizontal splitter to make them resizable.
2021-05-08 00:30:38 +01:00
Brian Gianforcaro
e3ee539fea Profiler: Don't iterate all events when filtering timeline view
There is no need to iterate through all events in a profile when
loading the timeline view, as soon as we see one event we can
move on to the next process.
2021-05-07 15:35:23 +02:00