Skip to content

Commit

Permalink
use clang-tidy command with task to generate items in problem's view.
Browse files Browse the repository at this point in the history
Signed-off-by: Jacques Bouthillier <[email protected]>
  • Loading branch information
lmcbout committed Jun 19, 2019
1 parent 7d19e12 commit 7e1d25a
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 2 deletions.
37 changes: 35 additions & 2 deletions packages/cpp/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -88,8 +88,9 @@ You can set the preference 'cpp.clangTidy' to enable the clang-tidy linter inclu
- using the preferences: 'cpp.clangTidyChecks'
- using the file '.clang-tidy' . The file is located in the same folder of the files or a parent folder.

Note: using the preference checks will supersede the value found in the .clang-tidy file.

```
Note: When the "cpp.clangTidyChecks" is used in the preference settings, the configs will be merged with the configuration found in ".clang-tidy" file. If you want to drop the configs from ".clang-tidy", you'd need to disable it in "cpp.clangTidyChecks", which is "cpp.clangTidyChecks": "-*".
```
The syntax used to fill the checks can be found at http://clang.llvm.org/extra/clang-tidy/

clang-tidy has its own checks and can also run Clang static analyzer checks. Each check has a name ([see link above for full list](http://clang.llvm.org/extra/clang-tidy/)). Clang-tidy takes as input the checks that should run, in the form of a comma-separated list of positive and negative (prefixed with -) globs. Positive globs add subsets of checks, negative globs remove them.
Expand All @@ -102,6 +103,38 @@ There are two ways to configure clang-tidy's checks: through a Theia preference
- for the .clang-tidy file: Checks: "-*,readability-*"
- Meaning: disable all list-checks and enable all readability-* checks

### Using clang-tidy as a task
In .theia/tasks.json, add the following:
```
{
"label": "[Task] clang-tidy",
"type": "shell",
"cwd": "${workspaceFolder}",
"command": "clang-tidy",
"args": [
"*"
],
"options": {},
"problemMatcher": [
"$clangTidyMatcher"
]
}
```
Definition of the fields:
```
"label": <string> // showed on task selection, after selecting "Run Task..."
"type": "shell", // where the command will be executed, choice: "shell" or "process"
"cwd": "${workspaceFolder}", // root folder
"command": "clang-tidy", // command execution, this program has to be installed on your computer
"args": [
"*" // which files will be looked at. Could also specified a single file
],
"options": {},
"problemMatcher": [
"$clangTidyMatcher" // to add the result to the Problems view
]
```

## License

- [Eclipse Public License 2.0](http://www.eclipse.org/legal/epl-2.0/)
Expand Down
24 changes: 24 additions & 0 deletions packages/cpp/src/browser/cpp-task-provider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

import parseArgv = require('string-argv');
import { inject, injectable, postConstruct } from 'inversify';
import { ProblemMatcherRegistry, ProblemPatternRegistry } from '@theia/task/lib/common/task-protocol';
import { ProcessTaskConfiguration } from '@theia/task/lib/common/process/task-protocol';
import { TaskContribution, TaskProvider, TaskProviderRegistry, TaskResolver, TaskResolverRegistry } from '@theia/task/lib/browser/task-contribution';
import { CppBuildConfigurationManager, CppBuildConfiguration } from './cpp-build-configurations';
Expand All @@ -37,10 +38,33 @@ export class CppTaskProvider implements TaskContribution, TaskProvider, TaskReso
@inject(TaskResolverRegistry) protected readonly taskResolverRegistry: TaskResolverRegistry;
@inject(TaskDefinitionRegistry) protected readonly taskDefinitionRegistry: TaskDefinitionRegistry;
@inject(CppBuildConfigurationManager) protected readonly cppBuildConfigurationManager: CppBuildConfigurationManager;
@inject(ProblemMatcherRegistry) protected readonly problemMatcherRegistry: ProblemMatcherRegistry;
@inject(ProblemPatternRegistry) protected readonly problemPatternRegistry: ProblemPatternRegistry;

@postConstruct()
protected init(): void {
this.registerTaskDefinition();
this.problemPatternRegistry.register({
name: 'clangTidyPattern',
regexp: '^(.+):(\\d+):(\\d+):\\s+(error|warning|info|note):\\s+(.+?)\\s+\\[(.+)\\]$',
'file': 1,
'line': 2,
'character': 3,
'severity': 4,
'message': 5,
'code': 6
});
this.problemMatcherRegistry.register({
'name': 'clangTidyMatcher',
label: 'for clangd',
'owner': 'clang-tidy',
'source': 'TASKclang-tidy',
'applyTo': 'alldocuments',
'fileLocation': [
'absolute'
],
'pattern': 'clangTidyPattern'
});
}

registerProviders(registry: TaskProviderRegistry) {
Expand Down

0 comments on commit 7e1d25a

Please sign in to comment.