Check Unnecessarily Public Code
Reports public top-level declarations (classes, mixins, enums, etc.) and class members (fields, methods, etc.) that are only used in the containing file (including parts) and can be made private.
To execute the command, run:
$ dcm check-unnecessarily-public-code lib # or dcm upc lib
Full command description:
Usage: dcm check-unnecessarily-public-code [arguments] <directories>
-h, --help Print this usage information.
--exclude-public-api (--ep) Exclude publicly exported code from the analysis output.
-r, --reporter="console" (--output-format) Analysis output format.
[console (default), json, codeclimate, gitlab, checkstyle, sonar]
-a, --absolute-path Show absolute paths in console reporter output.
--output-to="path/to/file" Path to the file with the analysis output.
-c, --print-config Print resolved config.
--root-folder="./" Root folder.
(defaults to the current directory)
-s, --sdk-path="directory-path" Dart SDK directory path.
If the project has a `.fvm/flutter_sdk` symlink, it will be used if the SDK is not found.
-e, --exclude="{**/*.g.dart,**/*.freezed.dart}" Files to exclude (in Glob syntax).
(defaults to "{**/*.g.dart,**/*.freezed.dart}")
--root-exclude Files to exclude, relative to the root folder (in Glob syntax).
--[no-]congratulate Show output even when there are no issues.
--verbose Show verbose logs.
--ci-key The license key to run on CI server. Can be provided via DCM_CI_KEY env variable.
--email The email used to purchase the license. Can be provided via DCM_EMAIL env variable.
--no-analytics Disable sending anonymous usage statistics.
--[no-]fatal-found Treat unnecessarily public code as fatal.
(defaults to on)
Suppressing the Command
To suppress issues produced by the command, add the ignore: unnecessarily-public-code comment. To suppress the command for an entire file, add the ignore_for_file: unnecessarily-public-code comment to the beginning of a file.
Excluding Public API
By default, this command analyzes all code, even if it's part a package's public API.
To exclude such code from the analysis, pass the exclude-public-api CLI flag.
This command follows this convention when locating API and implementation files.
Overriding "exclude-public-api" for a Particular Package
To override the exclude-public-api flag for a particular package, set the exclude-public-api entry in the analysis_options.yaml.
Output Example
Console (default)
Use --reporter=console to get output in console format.

JSON
Use --reporter=json to get output as a single JSON object containing metadata and the list of unnecessarily public code issues.
Format specification
The root object fields are
formatVersion- an integer representing the format version (will be incremented each time the serialization format changes)timestamp- a creation time of the report in YYYY-MM-DD HH:MM:SS formatunnecessarilyPublicCodeResults- an array of objectssummary- an array of objects
{
"formatVersion": 10,
"timestamp": "2021-04-11 14:44:42",
"unnecessarilyPublicCodeResults": [
{
...
},
{
...
},
{
...
}
],
"summary": [
{
...
},
{
...
}
]
}
The result object fields are
path- the relative path to the file with issuesissues- an array of issues detected in the target file
{
"path": "lib/src/some/file.dart",
"issues": [
...
],
}
The issue object fields are
id- issue idmessage- the message associated with the issuelocation- the location associated with the issueeffortInMinutes- an estimated effort to fix the issue (in minutes)declarationName- unnecessarily public declaration namedeclarationType- unnecessarily public declaration type
{
"id": "unnecessarily-public-issue",
"message": "This public class PartClass is referenced only in its library and can be made private",
"location": {
...
},
"effortInMinutes": 2,
"declarationName": "PartClass",
"declarationType": "class",
}
The location object fields are
startColumn- the start column of the entitystartLine- the start line of the entityendColumn- the end column of the entityendLine- the end line of the entitystartOffset- the offset of the entity
{
"endColumn": 2,
"endLine": 90,
"startColumn": 1,
"startLine": 48,
"startOffset": 1638
}
The summary-record object fields are
title- a message with the summary entry titlevalue- the actual value of the entry
{
"title": "Total unnecessarily public code declarations",
"value": 1
}
GitLab
Use --reporter=gitlab to get output in a GitLab-compatible format. To learn how to integrate DCM with GitLab, refer to this guide.
Code Climate
Use --reporter=codeclimate to get output in Code Climate format.
Output example
{"type":"issue","check_name":"unnecessarily-public-issue","description":"This public field someField is referenced only in its library and can be made private","categories":["Bug Risk"],"location":{"path":"lib/src/buttons/pulldown_button.dart","positions":{"begin":{"column":3,"line":41},"end":{"column":25,"line":41}}},"severity":"major","fingerprint":"46ed0a539d46e514e67003f0a661976e"}
{"type":"issue","check_name":"unnecessarily-public-issue","description":"This public field someField is referenced only in its library and can be made private","categories":["Bug Risk"],"location":{"path":"lib/src/buttons/pulldown_button.dart","positions":{"begin":{"column":3,"line":41},"end":{"column":25,"line":41}}},"severity":"major","fingerprint":"46ed0a539d46e514e67003f0a661976e"}
Checkstyle
Use --reporter=checkstyle to get output in Checkstyle format.
Output example
<?xml version="1.0"?>
<checkstyle version="10.0">
<file name="example.dart">
<error line="5" column="3" severity="warning" message="This public field someField is referenced only in its library and can be made private" source="unnecessarily-public-issue"/>
</file>
</checkstyle>
Checkstyle format is supported by Bitbucket. To learn how to integrate DCM with Bitbucket, refer to this guide.
Sonar
Use --reporter=sonar to get output in SonarQube's generic format for external issues.
Output example
{
"rules": [
{
"cleanCodeAttribute": "CLEAR",
"description": "To learn more, visit the documentation https://dcm.dev/docs/cli/code-quality-checks/unnecessarily-public-code/",
"engineId": "dcm",
"id": "unnecessarily-public-issue",
"impacts": [
{
"severity": "MEDIUM",
"softwareQuality": "MAINTAINABILITY"
}
],
"name": "unnecessarily-public-issue"
}
],
"issues": [
{
"effortMinutes": 2,
"primaryLocation": {
"filePath": "lib/src/home_i18n.dart",
"message": "This public class SomeClass is referenced only in its library and can be made private",
"textRange": {
"endColumn": 9,
"endLine": 14,
"startColumn": 3,
"startLine": 10
}
},
"ruleId": "unnecessarily-public-issue"
},
{
"effortMinutes": 10,
"primaryLocation": {
"filePath": "lib/src/home_i18n.dart",
"message": "This public method someMethod is referenced only in its library and can be made private",
"textRange": {
"endColumn": 9,
"endLine": 20,
"startColumn": 3,
"startLine": 16
}
},
"ruleId": "unnecessarily-public-issue"
}
]
}