Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / lazarus / 2026-07

FpSonar - a pascal linter

5 messages · 2 people · –

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

Michael Van Canneyt

Hi,

I've finished something I have been brooding on for some months now:

FPSonar - a Object Pascal linter, written in Object Pascal

What does it do?

It has roughly 140-150 rules on how pascal code should be written to be readable. It parses your code (using fcl-passrc) and will check all these rules. It will then generate a report.

Examples of checks:

RoutineTooLarge - too long routines are flagged.

TooManyParameters - Procedure takes too many parameters.

TooManyNestedRoutines - too many local nested routines.

RemoveUnusedConstant - there is a constant that is never used.

FileNotTooManyClasses - too many classes in a file.

FormatArgumentType - wrong type for Format() argument.

LowercaseKeywords - keywords should be lowercase.

Some of these the compiler will flag (or the IDE code observer), but most are not. There are many of them.

You can configure these checks (how long is too long, what is too many parameters etc.) or disable checks altogether. The configuration file is a JSON file.

You can also mark a line in code so it will not be checked:

  SomeCommand; // NOSONAR

The NOSONAR comment will suppress any warnings about that line.

The basic rule is: if the linter cannot determine with certainty that something is wrong, it will not report it. For example, if it cannot with certainty determine the type of a format argument, then no error/warning will be reported about a type mismatch.

In order to do its job properly, it sometimes needs to know what the FPC units contain, and it automatically runs FPC's ppudump tool to find out - so it does not need to parse the FPC code (although it can also do the latter). In case you don't want that, you can let it simply use some built-in basic copies of some essential FPC units (system, sysutils, classes).

To start using this tool on an old codebase can prove daunting - you can start out with many 1000's of 'errors'. In order to help with that you can make a baseline, a snapshot which you can compare against in subsequent runs so you at least don't make things worse. This gives you time to slowly fix the existing issues while ensuring you don't add new ones.

I'm still working on a Lazarus IDE plugin.

In case you were wondering about the name: it's a reference to SonarQube, a Java tool which does something similar (even for Pascal), but is 1000 times harder to use than fpSonar.

If you find you're missing checks or have ideas for additional checks, feel free to contact me. if they can be implemented, I will ,

Michael.

Reply by email

Michael Van Canneyt

Sorry, I should have been more clear. This is part of fpc.

So it's in gitlab:

https://gitlab.com/freepascal.org/fpc/source/-/tree/main/utils/fpsonar

The code compiles with FPC 3.2.2, though, I made sure of that. I'll see about making a zip with just the fcl-passrc/sonar units, and report back.

Michael.

Tim Coates wrote 85 lines
Hi Michael, Link please? I'd love to try it out. Tim On Thu, 9 July 2026, 6:22?am Michael Van Canneyt via fpc-pascal, < > wrote: > > Hi, > > I've finished something I have been brooding on for some months now: > > FPSonar - a Object Pascal linter, written in Object Pascal > > What does it do? > > It has roughly 140-150 rules on how pascal code should be written to be > readable. It parses your code (using fcl-passrc) and will check all these > rules. It will then generate a report. > > Examples of checks: > > RoutineTooLarge - too long routines are flagged. > > TooManyParameters - Procedure takes too many parameters. > > TooManyNestedRoutines - too many local nested routines. > > RemoveUnusedConstant - there is a constant that is never used. > > FileNotTooManyClasses - too many classes in a file. > > FormatArgumentType - wrong type for Format() argument. > > LowercaseKeywords - keywords should be lowercase. > > Some of these the compiler will flag (or the IDE code observer), > but most are not. There are many of them. > > You can configure these checks (how long is too long, what is too many > parameters etc.) or disable checks altogether. The configuration file is a > JSON file. > > You can also mark a line in code so it will not be checked: > SomeCommand; // NOSONAR > The NOSONAR comment will suppress any warnings about that line. > > The basic rule is: if the linter cannot determine with certainty that > something is wrong, it will not report it. For example, if it cannot with > certainty determine the type of a format argument, then no error/warning > will be reported about a type mismatch. > > In order to do its job properly, it sometimes needs to know what the FPC > units > contain, and it automatically runs FPC's ppudump tool to find out - so it > does not need to parse the FPC code (although it can also do the latter). > In case you don't want that, you can let it simply use some built-in basic > copies of some essential FPC units (system, sysutils, classes). > > To start using this tool on an old codebase can prove daunting - you can > start out with many 1000's of 'errors'. In order to help with that you can > make a baseline, a snapshot which you can compare against in subsequent > runs > so you at least don't make things worse. This gives you time to slowly fix > the existing issues while ensuring you don't add new ones. > > I'm still working on a Lazarus IDE plugin. > > In case you were wondering about the name: it's a reference to SonarQube, > a Java tool which does something similar (even for Pascal), > but is 1000 times harder to use than fpSonar. > > If you find you're missing checks or have ideas for additional checks, > feel free to contact me. if they can be implemented, I will look at it. > > Enjoy, > > Michael. > _______________________________________________ > fpc-pascal maillist - > https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal >

Reply by email

Michael Van Canneyt
to Michael Van Canneyt

Hi,

I published the fpsonar plugin for lazarus.

https://gitlab.com/freepascal.org/fpsonar

It also contains the command-line utility.

The plugin/cli build with FPC 3.2.2 and FPC 3.3.1.

I think the core engine and plugin are feature-complete as far as checking is concerned, but ideas for improvement or new rules are always welcome.

I'll look into adding quick-fixes to the IDE plugin.

Michael.

Michael Van Canneyt wrote 99 lines
Sorry, I should have been more clear. This is part of fpc. So it's in gitlab: https://gitlab.com/freepascal.org/fpc/source/-/tree/main/utils/fpsonar The code compiles with FPC 3.2.2, though, I made sure of that. I'll see about making a zip with just the fcl-passrc/sonar units, and report back. Michael. On Thu, 9 Jul 2026, Tim Coates via fpc-pascal wrote: > Hi Michael, > > Link please? I'd love to try it out. > > Tim > > On Thu, 9 July 2026, 6:22?am Michael Van Canneyt via fpc-pascal, < > > wrote: > >> >> Hi, >> >> I've finished something I have been brooding on for some months now: >> >> FPSonar - a Object Pascal linter, written in Object Pascal >> >> What does it do? >> >> It has roughly 140-150 rules on how pascal code should be written to be >> readable. It parses your code (using fcl-passrc) and will check all these >> rules. It will then generate a report. >> >> Examples of checks: >> >> RoutineTooLarge - too long routines are flagged. >> >> TooManyParameters - Procedure takes too many parameters. >> >> TooManyNestedRoutines - too many local nested routines. >> >> RemoveUnusedConstant - there is a constant that is never used. >> >> FileNotTooManyClasses - too many classes in a file. >> >> FormatArgumentType - wrong type for Format() argument. >> >> LowercaseKeywords - keywords should be lowercase. >> >> Some of these the compiler will flag (or the IDE code observer), >> but most are not. There are many of them. >> >> You can configure these checks (how long is too long, what is too many >> parameters etc.) or disable checks altogether. The configuration file is a >> JSON file. >> >> You can also mark a line in code so it will not be checked: >> SomeCommand; // NOSONAR >> The NOSONAR comment will suppress any warnings about that line. >> >> The basic rule is: if the linter cannot determine with certainty that >> something is wrong, it will not report it. For example, if it cannot with >> certainty determine the type of a format argument, then no error/warning >> will be reported about a type mismatch. >> >> In order to do its job properly, it sometimes needs to know what the FPC >> units >> contain, and it automatically runs FPC's ppudump tool to find out - so it >> does not need to parse the FPC code (although it can also do the latter). >> In case you don't want that, you can let it simply use some built-in basic >> copies of some essential FPC units (system, sysutils, classes). >> >> To start using this tool on an old codebase can prove daunting - you can >> start out with many 1000's of 'errors'. In order to help with that you can >> make a baseline, a snapshot which you can compare against in subsequent >> runs >> so you at least don't make things worse. This gives you time to slowly fix >> the existing issues while ensuring you don't add new ones. >> >> I'm still working on a Lazarus IDE plugin. >> >> In case you were wondering about the name: it's a reference to SonarQube, >> a Java tool which does something similar (even for Pascal), >> but is 1000 times harder to use than fpSonar. >> >> If you find you're missing checks or have ideas for additional checks, >> feel free to contact me. if they can be implemented, I will look at it. >> >> Enjoy, >> >> Michael. >> _______________________________________________ >> fpc-pascal maillist - >> https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal >>

Reply by email