aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/mparser.py
AgeCommit message (Collapse)AuthorFilesLines
2024-04-08meson format commandCharles Brunet1-0/+3
2024-04-08parser: revert to single StringNode typeCharles Brunet1-23/+11
this will allow transforming string types in the formater
2024-04-08fix colon wrongly named column in parserCharles Brunet1-14/+14
In #02ff955, I used the word `columns` instead of `colons`, but the meaning really was about the ':' symbol.
2024-02-23Detect utf8 bom from meson build filesCharles Brunet1-0/+4
Some text editors on Windows may use utf8bom encoding by default. Prevent crash and properly report misencoded files. Fixes #12766.
2024-02-12Remove implicit-optional assignment in `__init__` that cannot ever be trueEli Schwartz1-1/+0
IfClauseNode is only ever initialized in such a way that this attribute is immediately set to something valid. And attempting to access its value when the value is None would be a pretty broken error anyway. The assignment served no purpose, but did perform a frivolous runtime op in addition to angering mypy's checks for implicit None.
2023-12-13Use SPDX-License-Identifier consistentlyDylan Baker1-11/+1
This replaces all of the Apache blurbs at the start of each file with an `# SPDX-License-Identifier: Apache-2.0` string. It also fixes existing uses to be consistent in capitalization, and to be placed above any copyright notices. This removes nearly 3000 lines of boilerplate from the project (only python files), which no developer cares to look at. SPDX is in common use, particularly in the Linux kernel, and is the recommended format for Meson's own `project(license: )` field
2023-09-11parser: allow whitespaces and comments in cont_eolCharles Brunet1-1/+1
FIXME: another approach would be to consider cont_eol as comment (i.e. add backslash and whitespaces to the comment regex). In both cases it works until we want to parse comments separately. TODO?: handle eol_cont inside a string (to split long string without breaking lines). Probably a bad idea and better to simply join a multiline string.
2023-09-11parser: preserve whitespaces and commentsCharles Brunet1-7/+60
2023-09-11parser: simplify other node constructorsCharles Brunet1-20/+15
2023-09-11parser: simplify by using Unary and Binary Operator NodeCharles Brunet1-42/+17
2023-09-11parser: simplify Assignment and PlusAssignment nodesCharles Brunet1-21/+6
2023-09-11parser: add SymbolNode to preserve operatorsCharles Brunet1-65/+201
2023-09-11parser: add ElseNodeCharles Brunet1-4/+13
2023-09-11parser: remember previous TokenCharles Brunet1-13/+10
2023-09-11parser: preserve value of all tokensCharles Brunet1-16/+10
2023-09-11parser: use IdNode for foreach varnamesCharles Brunet1-4/+4
2023-09-11parser: use IdNode for function name and assignment nameCharles Brunet1-16/+12
2023-09-11parser: preserve escape chars in stringsCharles Brunet1-11/+22
use separate Node for multiline strings
2023-09-11parser: remove useless __str__ methods on nodesCharles Brunet1-8/+4
2023-09-11parser: preserve number baseCharles Brunet1-2/+10
2023-09-11parser: more specific error for float numbersCharles Brunet1-0/+3
2023-09-11Add ParenthesizedNodeJCWasmx861-1/+10
2023-08-11treewide: automatic rewriting of all comment-style type annotationsEli Schwartz1-2/+2
Performed using https://github.com/ilevkivskyi/com2ann This has no actual effect on the codebase as type checkers (still) support both and negligible effect on runtime performance since __future__ annotations ameliorates that. Technically, the bytecode would be bigger for non function-local annotations, of which we have many either way. So if it doesn't really matter, why do a large-scale refactor? Simple: because people keep wanting to, but it's getting nickle-and-dimed. If we're going to do this we might as well do it consistently in one shot, using tooling that guarantees repeatability and correctness. Repeat with: ``` com2ann mesonbuild/ ```
2023-08-11remove useless type annotationsEli Schwartz1-3/+3
These annotations all had a default initializer of the correct type, or a parent class annotation.
2023-06-01mparser: Further cleanup node definitionsXavier Claessens1-98/+88
- Include BaseNode position in hash methods, integer is the most straightforward way of differentiating nodes. - Exclude non hashable fields from hash method. - Avoid using default values in BaseNode that way subclasses can have fields wihtout default value without repeating init=False. - Nodes that does not add fields does not need `@dataclass`. - Make all node types hashable because they can be used for feature_key in FeatureCheckBase.use(). - Remove unused type annotations
2023-06-01mparser: add equality operators to nodesDylan Baker1-54/+161
This makes use of dataclasses, but without a dataclass generated initializer. This means that we get nice `__repr__` and `__eq__` methods without having to type them by hand. Pylance understands `dataclass(init=False)`, but mypy doesn't. https://github.com/microsoft/pyright/issues/1753 https://github.com/python/mypy/issues/10309
2023-03-01mparser: Add partial AST to exceptionsEli Schwartz1-6/+17
Surprisingly enough we need to do this twice. In some cases (failing-meson/72 triggers this) we can error out after parsing the codeblock, but without getting the expected eof. We need to catch both exceptions as either one can interrupt the built codeblock object. Co-authored-by: Xavier Claessens <xavier.claessens@collabora.com>
2023-03-01mparser: use an inherited ParseException everywhereEli Schwartz1-3/+3
2023-03-01Revert "Exit meson with an error if an invalid escape sequence is found in a"Eli Schwartz1-13/+2
This reverts commit 348248f0a19bdc80e8a184befb2faaa1d5e66f40. The rules were relaxed in commit ccc4ce28cc9077d77a0bc9e72b1177eba1be7186 to permit this, so it's never possible to raise this exception anymore. But that commit was incomplete, and didn't remove the now-useless infrastructure for exception handling. The test needed to test this was always broken, and then removed in commit 465ef856ac9b978f13414db4aff649c66f2e6be5, and still this useless try/except persisted.
2023-03-01interpreter: Add testcase..endtestcase clause supportXavier Claessens1-0/+20
This is currently only enabled when running unit tests to facilitate writing failing unit tests. Fixes: #11394
2023-02-01treewide: add future annotations importEli Schwartz1-1/+1
2023-01-17mparser: Use a literal for the ComparisonNodeDylan Baker1-11/+18
And fix a bug where `not in` is in the wrong order.
2023-01-03mparser: Don't create an exception to pass to mlog.warningDylan Baker1-5/+4
Just call `mlog.code_line` directly, since the exception is never raised.
2023-01-03mlog: move code for printing code with a caret to the mlog moduleDylan Baker1-1/+1
We need this outside the constructor for the ParseException class, so let's pull it out. mlog seemed like a good place since it's a text formatting function, and has no dependencies.
2023-01-03mparser: don't pass a SimpleNamespace where a BaseNode is expectedDylan Baker1-2/+1
mypy spotted this as well. And it turns out that we're not setting the column either for the warning, so improvements!
2022-12-11typing: fix some broken Sequence annotationsEli Schwartz1-1/+1
T.Sequence is a questionable concept. The idea is to hammer out generic, maximally forgiving APIs that operate on protocols, which is a fancy way of saying "I don't care if you use tuples or lists". This is rarely needed, actually, and in exchange for this fancy behavior you get free bugs. Specifically, `somestr` is of type `T.Sequence[str]`, and also `somestr[0]` is another string of type you guessed it. It's ~~turtles~~ strings all the way down. It's worth noting that trying to code for "protocols" is a broken concept if the contents have semantic meaning, e.g. it operates on "the install tags of this object" rather than "an iterable that supports efficient element access". The other way to use T.Sequence is "I don't like that T.List is invariant, but also I don't like that T.Tuple makes you specify exact ordering". This sort of works. In fact it probably does work as long as you don't allow str in your sequences, which of course everyone allows anyway. Use of Sequence has cute side effects, such as actually passing lists around, knowing that you are going to get a list and knowing that you need to pass it on as a list, and then having to re-allocate as `list(mylist)` "because the type annotations says it could be a str or tuple". Except it cannot be a str, because if it is then the application is fatally flawed and logic errors occur to disastrous end user effects, and the type annotations: - do not enforce their promises of annotating types - fail to live up to "minimal runtime penalties" due to all the `list()` Shun this broken concept, by hardening the type annotations. As it turns out, we do not actually need any of this covariance or protocol-ism for a list of strings! The whole attempt was a slow, buggy waste of time.
2022-09-19pylint: enable consider-using-inDylan Baker1-1/+1
2022-05-01Add support for multiline f-stringsPeter Lesslie1-4/+19
+ Extend the parser to recognize the multiline f-strings, which the documentation already implies will work. The syntax is like: ``` x = 'hello' y = 'world' msg = f'''This is a multiline string. Sending a message: '@x@ @y@' ''' ``` which produces: ``` This is a multiline string. Sending a message: 'hello world' ``` + Added some f-string tests cases to "62 string arithmetic" to exercise the new behavior.
2022-02-16fix malformed warning to print the way it was meant to printEli Schwartz1-9/+5
Given a meson.build with the contents: ``` t = ' ' ``` We want to warn that this is bad. So we emitted this warning: ``` WARNING: Newline character in a string detected, use ''' (three single quotes) for multiline strings instead. This will become a hard error in a future Meson release. t = ' 4 4 ``` The line contents and the offset are printed as gibberish after a big whitespace run. These are elsewhere often passed to ParseException, which pretty-prints this, but newlines aren't an exception, merely a warning, and mlog.warning doesn't accept numeric strings as anything more meaningful than something to print as text. Fix this (by wrapping it in a ParseException) to properly print: ``` meson.build:4: WARNING: Newline character in a string detected, use ''' (three single quotes) for multiline strings instead. This will become a hard error in a future Meson release. t = ' ^ ```
2022-02-16fix a couple misuses of textwrap.dedentEli Schwartz1-1/+1
A backslash-escape of the last newline before a run of whitespace leading to the indented string ending and function termination `)` does not actually escape the entire line and make it do nothing. In fact what it does is cause all that whitespace to be part of the preceding line, and get printed. Meanwhile the textwrap.dedent documentation states that lines with only whitespace get normalized. When you *don't* mess with that final line, dedent actually does the right thing and makes the output message end with a single newline after the important text.
2022-01-10first pass at migrating to dataclassesEli Schwartz1-14/+21
In some cases, init variables that accept None as a sentinel and immediately overwrite with [], are migrated to dataclass field factories. \o/ Note: dataclasses by default cannot provide eq methods, as they then become unhashable. In the future we may wish to opt into declaring them frozen, instead/additionally.
2021-08-31pylint: turn on superflous-parensDylan Baker1-5/+5
We have a lot of these. Some of them are harmless, if unidiomatic, such as `if (condition)`, others are potentially dangerous `assert(...)`, as `assert(condtion)` works as expected, but `assert(condition, message)` will result in an assertion that never triggers, as what you're actually asserting is `bool(tuple[2])`, which will always be true.
2021-08-31pylint: enable consider-iterating-dictionaryDylan Baker1-1/+1
This didn't actually catch what it's supposed to, which is cases of: ```python for x in dict.keys(): y = dict[x] ``` But it did catch one unnecessary use of keys(), and one case where we were doing something in an inefficient way. I've rewritten: ```python if name.value in [x.value for x in self.kwargs.keys() if isinstance(x, IdNode)]: ``` as ``python if any((isinstance(x, IdNode) and name.value == x.value) for x in self.kwargs): ``` Which avoids doing two iterations, one to build the list, and a second to do a search for name.value in said list, which does a single short circuiting walk, as any returns as soon as one check returns True.
2021-03-10Add support for basic format stringsLaurin-Luis Lehning1-2/+13
2021-03-04mass rewrite of string formatting to use f-strings everywhereEli Schwartz1-6/+6
performed by running "pyupgrade --py36-plus" and committing the results
2020-09-08typing: fix code reviewDaniel Mensinger1-1/+1
2020-09-08typing: fully annotate mparser.pyDaniel Mensinger1-14/+25
2020-05-23ast: Add AST JSON printerDaniel Mensinger1-7/+5
2020-04-04mparser: fix precedence of arithmetic operatorsAndrei Alexeyev1-27/+33
The arithmetic operators are now split into two groups: * The add/sub group: +, - * The mul/div group: *, /, % All operators within the same group are left-associative and have equal precedence. The mul/div group has a higher precedence than the add/sub group, as one would expect. Previously every operator had a different precedence and was right-associative, which resulted in surprising behavior. This is a potentially breaking change for projects that relied on the old incorrect behavior. Fixes #6870
2020-03-02types: Remove redundant __init__() -> None annotationDaniel Mensinger1-26/+26