[fpc-pascal] FpSonar - a pascal linter

Michael Van Canneyt michael at freepascal.org
Sun Jul 12 11:08:44 CEST 2026



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.

On Thu, 9 Jul 2026, Michael Van Canneyt wrote:

>
> 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, <
>> fpc-pascal at lists.freepascal.org> 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  -  fpc-pascal at lists.freepascal.org
>>> https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
>>> 
>


More information about the fpc-pascal mailing list