diff --git a/package.json b/package.json index a763c198..8435338c 100644 --- a/package.json +++ b/package.json @@ -784,6 +784,10 @@ "command": "cmsis-csolution.list.find", "title": "Search" }, + { + "command": "cmsis-csolution.edit", + "title": "Edit" + }, { "command": "cmsis-csolution.showSolutionOutline", "title": "Show Solution Outline" @@ -929,6 +933,10 @@ "command": "cmsis-csolution.addToGroup", "when": "false" }, + { + "command": "cmsis-csolution.edit", + "when": "false" + }, { "command": "cmsis-csolution.showConfigWizardPreview", "when": "false" @@ -1145,6 +1153,11 @@ "when": "view == cmsis-csolution.outline && viewItem =~ /group|file/", "group": "contextMenu" }, + { + "command": "cmsis-csolution.edit", + "when": "view == cmsis-csolution.outline && viewItem =~ /(^|;)(group|file|component)(;|$)/", + "group": "contextMenu" + }, { "command": "cmsis-csolution.runGenerator", "when": "view == cmsis-csolution.outline && viewItem =~ /component-gen/", diff --git a/src/desktop/extension.ts b/src/desktop/extension.ts index be75b9f5..b722152d 100644 --- a/src/desktop/extension.ts +++ b/src/desktop/extension.ts @@ -55,6 +55,7 @@ import { CreateSolutionWebviewMain } from '../views/create-solutions/create-solu import { ManageLayersWebviewMain } from '../views/manage-layers/manage-layers-webview-main'; import { AddToGroupCommand } from '../views/solution-outline/commands/add-to-group-command'; import { DeleteCommand } from '../views/solution-outline/commands/delete-command'; +import { EditCommand } from '../views/solution-outline/commands/edit-command'; import { OpenCommand } from '../views/solution-outline/commands/open-command'; import { FindCommand } from '../views/solution-outline/commands/find-command'; import { MergeCommand } from '../views/solution-outline/commands/merge-command'; @@ -210,6 +211,7 @@ export const activate = async (context: ExtensionContext): Promise { + let commandsProvider: MockCommandsProvider; + let cprojectPath: string; + let yamlContent: string; + let positionAt: jest.Mock; + const testDataHandler = new TestDataHandler(); + + beforeEach(() => { + commandsProvider = commandsProviderFactory(); + cprojectPath = path.join(testDataHandler.tmpDir, 'test.cproject.yml'); + + yamlContent = `project: + groups: + - group: App + files: + - file: src/main.c + groups: + - group: Drivers + files: + - file: drv.c + components: + - component: ARM::CMSIS:RTOS2 +`; + + fsUtils.writeTextFile(cprojectPath, yamlContent); + + positionAt = jest.fn().mockReturnValue(new vscode.Position(0, 0)); + jest.spyOn(vscode.workspace, 'openTextDocument').mockResolvedValue({ positionAt } as unknown as vscode.TextDocument); + jest.spyOn(vscode.window, 'showTextDocument').mockResolvedValue({} as vscode.TextEditor); + }); + + afterEach(() => { + jest.restoreAllMocks(); + testDataHandler.rmFile(cprojectPath); + }); + + afterAll(() => { + testDataHandler.dispose(); + }); + + it('registers the edit command on activation', async () => { + const editCommand = new EditCommand(commandsProvider); + + await editCommand.activate(extensionContextFactory()); + + expect(commandsProvider.registerCommand).toHaveBeenCalledWith( + EditCommand.editCommandId, + expect.any(Function), + editCommand, + ); + }); + + it('opens cproject.yml at the selected group entry', async () => { + const editCommand = new EditCommand(commandsProvider); + await editCommand.activate(extensionContextFactory()); + + const groupNode = new COutlineItem('group'); + groupNode.setAttribute('groupPath', 'App;Drivers'); + groupNode.setAttribute('projectUri', cprojectPath); + + await commandsProvider.mockRunRegistered(EditCommand.editCommandId, groupNode); + + expect(vscode.workspace.openTextDocument).toHaveBeenCalledWith(vscode.Uri.file(cprojectPath)); + expect(positionAt).toHaveBeenCalledTimes(1); + const actualOffset = positionAt.mock.calls[0][0] as number; + expect(actualOffset).toBeGreaterThanOrEqual(0); + expect(yamlContent.slice(actualOffset)).toContain('group: Drivers'); + expect(vscode.window.showTextDocument).toHaveBeenCalled(); + }); + + it('opens cproject.yml at the selected file entry', async () => { + const editCommand = new EditCommand(commandsProvider); + await editCommand.activate(extensionContextFactory()); + + const groupNode = new COutlineItem('group'); + groupNode.setAttribute('groupPath', 'App;Drivers'); + groupNode.setAttribute('projectUri', cprojectPath); + + const fileNode = groupNode.createChild('file'); + fileNode.setAttribute('projectUri', cprojectPath); + fileNode.setAttribute('fileUri', 'drv.c'); + + await commandsProvider.mockRunRegistered(EditCommand.editCommandId, fileNode); + + expect(vscode.workspace.openTextDocument).toHaveBeenCalledWith(vscode.Uri.file(cprojectPath)); + expect(positionAt).toHaveBeenCalledTimes(1); + const actualOffset = positionAt.mock.calls[0][0] as number; + expect(actualOffset).toBeGreaterThanOrEqual(0); + expect(yamlContent.slice(actualOffset)).toContain('file: drv.c'); + expect(vscode.window.showTextDocument).toHaveBeenCalled(); + }); + + it('opens cproject.yml at the selected component entry', async () => { + const editCommand = new EditCommand(commandsProvider); + await editCommand.activate(extensionContextFactory()); + + const componentNode = new COutlineItem('component'); + componentNode.setAttribute('label', 'ARM::CMSIS:RTOS2'); + componentNode.setAttribute('projectUri', cprojectPath); + + await commandsProvider.mockRunRegistered(EditCommand.editCommandId, componentNode); + + expect(vscode.workspace.openTextDocument).toHaveBeenCalledWith(vscode.Uri.file(cprojectPath)); + expect(positionAt).toHaveBeenCalledTimes(1); + const actualOffset = positionAt.mock.calls[0][0] as number; + expect(actualOffset).toBeGreaterThanOrEqual(0); + expect(yamlContent.slice(actualOffset)).toContain('component: ARM::CMSIS:RTOS2'); + expect(vscode.window.showTextDocument).toHaveBeenCalled(); + }); + + it('ignores file nodes outside editable groups', async () => { + const editCommand = new EditCommand(commandsProvider); + await editCommand.activate(extensionContextFactory()); + + const nonEditableNode = new COutlineItem('file'); + nonEditableNode.setAttribute('fileUri', 'out/test.map'); + + await commandsProvider.mockRunRegistered(EditCommand.editCommandId, nonEditableNode); + + expect(vscode.workspace.openTextDocument).not.toHaveBeenCalled(); + expect(vscode.window.showTextDocument).not.toHaveBeenCalled(); + }); + +}); diff --git a/src/views/solution-outline/commands/edit-command.ts b/src/views/solution-outline/commands/edit-command.ts new file mode 100644 index 00000000..2680006d --- /dev/null +++ b/src/views/solution-outline/commands/edit-command.ts @@ -0,0 +1,179 @@ +/** + * Copyright 2026 Arm Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as vscode from 'vscode'; +import * as yaml from 'yaml'; +import { CommandsProvider } from '../../../vscode-api/commands-provider'; +import * as manifest from '../../../manifest'; +import { COutlineItem } from '../tree-structure/solution-outline-item'; +import { getGroupPathArray } from '../utils'; +import { buildPathFromContentToGroup } from '../../../solutions/edit/manage-group-items'; +import { getYamlNodeAtPath, listItem, mapKey } from '../../../solutions/edit/edit-yaml'; +import { readTextFile } from '../../../utils/fs-utils'; + +export class EditCommand { + public static readonly editCommandId = `${manifest.PACKAGE_NAME}.edit`; + + constructor( + private readonly commandsProvider: CommandsProvider, + ) { } + + public async activate(context: Pick) { + context.subscriptions.push( + this.commandsProvider.registerCommand(EditCommand.editCommandId, async (node: COutlineItem) => { + await this.editNode(node); + }, this), + ); + } + + private async editNode(node: COutlineItem): Promise { + const tag = node.getTag(); + if (tag !== 'group' && tag !== 'file' && tag !== 'component') { + return; + } + + const filePath = node.originFilePath; + if (!filePath) { + return; + } + + const groupPath = this.getGroupPathForNode(node); + if ((tag === 'group' || tag === 'file') && groupPath.length === 0) { + return; + } + + const parentType = this.getParentTypeFromNode(node); + const offset = tag === 'group' + ? this.findGroupOffset(filePath, parentType, groupPath) + : tag === 'file' + ? this.findFileOffset(filePath, parentType, groupPath, node.getAttribute('fileUri')) + : this.findComponentOffset(filePath, parentType, node.getAttribute('label')); + + if (offset === undefined) { + return; + } + + const document = await vscode.workspace.openTextDocument(vscode.Uri.file(filePath)); + const position = document.positionAt(offset); + await vscode.window.showTextDocument(document, { + selection: new vscode.Range(position, position), + preview: false, + }); + } + + private getGroupPathForNode(node: COutlineItem): string[] { + if (node.getTag() === 'group') { + return getGroupPathArray(node); + } + + const parent = node.getParent(); + if (!parent || !(parent instanceof COutlineItem) || parent.getTag() !== 'group') { + return []; + } + + return getGroupPathArray(parent); + } + + private findGroupOffset(filePath: string, parentType: 'project' | 'layer', groupPath: string[]): number | undefined { + const input = readTextFile(filePath); + if (!input) { + return undefined; + } + + const yamlDocument = yaml.parseDocument(input); + const contents = yamlDocument.contents; + if (!contents) { + return undefined; + } + + const targetGroupName = groupPath[groupPath.length - 1]; + if (!targetGroupName) { + return undefined; + } + + const pathToParentGroup = buildPathFromContentToGroup(groupPath.slice(0, -1), [mapKey(parentType)]); + const pathToTargetGroup = [ + ...pathToParentGroup, + mapKey('groups'), + listItem(item => yaml.isMap(item) && item.get('group') === targetGroupName), + ]; + + const targetGroupNode = getYamlNodeAtPath(contents, pathToTargetGroup); + return (targetGroupNode && yaml.isNode(targetGroupNode) && targetGroupNode.range) + ? targetGroupNode.range[0] + : undefined; + } + + private findFileOffset(filePath: string, parentType: 'project' | 'layer', groupPath: string[], fileUri?: string): number | undefined { + if (!fileUri) { + return undefined; + } + + const input = readTextFile(filePath); + if (!input) { + return undefined; + } + + const yamlDocument = yaml.parseDocument(input); + const contents = yamlDocument.contents; + if (!contents) { + return undefined; + } + + const pathToTargetFile = [ + ...buildPathFromContentToGroup(groupPath, [mapKey(parentType)]), + mapKey('files'), + listItem(item => yaml.isMap(item) && item.get('file') === fileUri), + ]; + + const targetFileNode = getYamlNodeAtPath(contents, pathToTargetFile); + return (targetFileNode && yaml.isNode(targetFileNode) && targetFileNode.range) + ? targetFileNode.range[0] + : undefined; + } + + private findComponentOffset(filePath: string, parentType: 'project' | 'layer', componentId?: string): number | undefined { + if (!componentId) { + return undefined; + } + + const input = readTextFile(filePath); + if (!input) { + return undefined; + } + + const yamlDocument = yaml.parseDocument(input); + const contents = yamlDocument.contents; + if (!contents) { + return undefined; + } + + const pathToTargetComponent = [ + mapKey(parentType), + mapKey('components'), + listItem(item => yaml.isMap(item) && item.get('component') === componentId), + ]; + + const targetComponentNode = getYamlNodeAtPath(contents, pathToTargetComponent); + return (targetComponentNode && yaml.isNode(targetComponentNode) && targetComponentNode.range) + ? targetComponentNode.range[0] + : undefined; + } + + private getParentTypeFromNode(node: COutlineItem): 'project' | 'layer' { + return node.getAttribute('layerUri') ? 'layer' : 'project'; + } +} diff --git a/src/views/solution-outline/tree-structure/solution-outline-project-items.ts b/src/views/solution-outline/tree-structure/solution-outline-project-items.ts index 8ac12d9b..eb863dec 100644 --- a/src/views/solution-outline/tree-structure/solution-outline-project-items.ts +++ b/src/views/solution-outline/tree-structure/solution-outline-project-items.ts @@ -214,7 +214,8 @@ export class ProjectItemsBuilder extends SolutionOutlineItemBuilder { componentsItem.addFeature('components'); // create components from project - const componentNodes = this.createComponentNodes(componentsItem as COutlineItem, children); + const topTag = cproject.getRoot()?.getChild()?.getTag() ?? ''; + const componentNodes = this.createComponentNodes(componentsItem as COutlineItem, children, topTag, cproject.rootFileName); if (cbuild) { this.addComponentDataFromCbuild(componentNodes, cbuild); @@ -303,8 +304,10 @@ export class ProjectItemsBuilder extends SolutionOutlineItemBuilder { return undefined; } - private createComponentNodes(componentsItem: COutlineItem, projectComponents: ITreeItem[]): Map { + private createComponentNodes(componentsItem: COutlineItem, projectComponents: ITreeItem[], topTag: string, rootFileName: string): Map { const componentNodes = new Map(); + const editable = topTag === 'project' || topTag === 'layer'; + for (const component of projectComponents) { const refId = component.getValue(); if (!refId) { @@ -316,6 +319,11 @@ export class ProjectItemsBuilder extends SolutionOutlineItemBuilder { componentItem.setAttribute('label', refId); componentItem.setAttribute('expandable', '0'); componentItem.setAttribute('iconPath', 'csolution-software-component'); + if (editable) { + componentItem.addFeature('component'); + componentItem.setAttribute('projectUri', topTag === 'project' ? rootFileName : undefined); + componentItem.setAttribute('layerUri', topTag === 'layer' ? rootFileName : undefined); + } componentNodes.set(refId, componentItem as COutlineItem); } diff --git a/test-data/solutions/USBD/CmsisViewTreeOneProjRef.txt b/test-data/solutions/USBD/CmsisViewTreeOneProjRef.txt index b51b3d1e..bec6f12a 100644 --- a/test-data/solutions/USBD/CmsisViewTreeOneProjRef.txt +++ b/test-data/solutions/USBD/CmsisViewTreeOneProjRef.txt @@ -102,9 +102,10 @@ solution label=ARM::CMSIS:OS Tick:SysTick expandable=1 iconPath=csolution-software-component + features=component;headerFile: + projectUri=TEST_DIR/solutions/USBD/MassStorage/MassStorage.cproject.yml tooltip=- component: ` ARM::CMSIS:OS Tick:SysTick@1.0.5 ` - from pack: ` ARM::CMSIS@6.1.0 ` - features=headerFile: header=os_tick.h file label=os_systick.c @@ -121,7 +122,8 @@ solution label=ARM::CMSIS:RTOS2:Keil RTX5&Source expandable=1 iconPath=csolution-software-component - features=docFile:;headerFile: + features=component;docFile:;headerFile: + projectUri=TEST_DIR/solutions/USBD/MassStorage/MassStorage.cproject.yml type=docFile docPath=${CMSIS_PACK_ROOT}/ARM/CMSIS-RTX/5.9.0/Documentation/index.html tooltip=- component: ` ARM::CMSIS:RTOS2:Keil RTX5&Source@5.9.0 ` @@ -212,9 +214,10 @@ solution label=Keil::USB&MDK:CORE expandable=1 iconPath=csolution-software-component + features=component;headerFile: + projectUri=TEST_DIR/solutions/USBD/MassStorage/MassStorage.cproject.yml tooltip=- component: ` Keil::USB&MDK:CORE@8.0.0 ` - from pack: ` Keil::MDK-Middleware@8.0.0-dev ` - features=headerFile: header=rl_usb.h file label=rl_usb.h @@ -236,7 +239,8 @@ solution label=Keil::USB&MDK:Device expandable=1 iconPath=csolution-software-component - features=docFile:;headerFile: + features=component;docFile:;headerFile: + projectUri=TEST_DIR/solutions/USBD/MassStorage/MassStorage.cproject.yml type=docFile docPath=TEST_DIR/MyLocalPath/MDK-Middleware/Documentation/html/USB/USB_Device.html tooltip=- component: ` Keil::USB&MDK:Device@8.0.0 ` @@ -272,7 +276,8 @@ solution label=Keil::USB&MDK:Device:MSC expandable=1 iconPath=csolution-software-component - features=docFile:;headerFile: + features=component;docFile:;headerFile: + projectUri=TEST_DIR/solutions/USBD/MassStorage/MassStorage.cproject.yml type=docFile docPath=TEST_DIR/MyLocalPath/MDK-Middleware/Documentation/html/USB/USB_Classes.html#MSC tooltip=- component: ` Keil::USB&MDK:Device:MSC@8.0.0 ` @@ -336,7 +341,8 @@ solution label=Keil::Device:CubeMX expandable=1 iconPath=csolution-software-component - features=component-gen + features=component;component-gen + layerUri=TEST_DIR/solutions/USBD/Board/B-U585I-IOT02A/Board.clayer.yml type=component-gen generator=CubeMX cbuild-context=MassStorage.Debug+B-U585I-IOT02A @@ -603,7 +609,8 @@ solution label=ARM::CMSIS:CORE expandable=1 iconPath=csolution-software-component - features=docFile:;headerFile: + features=component;docFile:;headerFile: + layerUri=TEST_DIR/solutions/USBD/Board/B-U585I-IOT02A/Board.clayer.yml type=docFile docPath=${CMSIS_PACK_ROOT}/ARM/CMSIS/6.1.0/CMSIS/Documentation/html/Core/index.html tooltip=- component: ` ARM::CMSIS:CORE@6.1.0 ` @@ -619,7 +626,8 @@ solution label=Keil::CMSIS Driver:USART expandable=1 iconPath=csolution-software-component - features=docFile:;headerFile: + features=component;docFile:;headerFile: + layerUri=TEST_DIR/solutions/USBD/Board/B-U585I-IOT02A/Board.clayer.yml type=docFile docPath=TEST_DIR/MyLocalPath/CMSIS-Driver_STM32/Documentation/html/usart_stm32.html tooltip=- component: ` Keil::CMSIS Driver:USART@3.0.0 ` @@ -648,7 +656,8 @@ solution label=Keil::CMSIS Driver:USB Device expandable=1 iconPath=csolution-software-component - features=docFile:;headerFile: + features=component;docFile:;headerFile: + layerUri=TEST_DIR/solutions/USBD/Board/B-U585I-IOT02A/Board.clayer.yml type=docFile docPath=TEST_DIR/MyLocalPath/CMSIS-Driver_STM32/Documentation/html/usbd_stm32.html tooltip=- component: ` Keil::CMSIS Driver:USB Device@3.0.0 ` @@ -677,9 +686,10 @@ solution label=Keil::CMSIS Driver:VIO:Board&B-U585I-IOT02A expandable=1 iconPath=csolution-software-component + features=component;headerFile: + layerUri=TEST_DIR/solutions/USBD/Board/B-U585I-IOT02A/Board.clayer.yml tooltip=- component: ` Keil::CMSIS Driver:VIO:Board&B-U585I-IOT02A@2.0.1 ` - from pack: ` Keil::B-U585I-IOT02A_BSP@2.0.0 ` - features=headerFile: header=cmsis_vio.h file label=cmsis_vio.h @@ -698,6 +708,8 @@ solution label=ARM::CMSIS-Compiler:CORE expandable=1 iconPath=csolution-software-component + features=component + layerUri=TEST_DIR/solutions/USBD/Board/B-U585I-IOT02A/Board.clayer.yml tooltip=- component: ` ARM::CMSIS-Compiler:CORE@1.1.0 ` - from pack: ` ARM::CMSIS-Compiler@2.1.0 ` file @@ -708,9 +720,10 @@ solution label=ARM::CMSIS-Compiler:STDERR:Custom expandable=1 iconPath=csolution-software-component + features=component;headerFile: + layerUri=TEST_DIR/solutions/USBD/Board/B-U585I-IOT02A/Board.clayer.yml tooltip=- component: ` ARM::CMSIS-Compiler:STDERR:Custom@1.1.0 ` - from pack: ` ARM::CMSIS-Compiler@2.1.0 ` - features=headerFile: header=retarget_stderr.h file label=retarget_stderr.h @@ -723,9 +736,10 @@ solution label=ARM::CMSIS-Compiler:STDOUT:Custom expandable=1 iconPath=csolution-software-component + features=component;headerFile: + layerUri=TEST_DIR/solutions/USBD/Board/B-U585I-IOT02A/Board.clayer.yml tooltip=- component: ` ARM::CMSIS-Compiler:STDOUT:Custom@1.1.0 ` - from pack: ` ARM::CMSIS-Compiler@2.1.0 ` - features=headerFile: header=retarget_stdout.h file label=retarget_stdout.h @@ -738,9 +752,10 @@ solution label=ARM::CMSIS-Compiler:STDIN:Custom expandable=1 iconPath=csolution-software-component + features=component;headerFile: + layerUri=TEST_DIR/solutions/USBD/Board/B-U585I-IOT02A/Board.clayer.yml tooltip=- component: ` ARM::CMSIS-Compiler:STDIN:Custom@1.1.0 ` - from pack: ` ARM::CMSIS-Compiler@2.1.0 ` - features=headerFile: header=retarget_stdin.h file label=retarget_stdin.h diff --git a/test-data/solutions/USBD/CmsisViewTreeRef.txt b/test-data/solutions/USBD/CmsisViewTreeRef.txt index 47147234..d3a56ed2 100644 --- a/test-data/solutions/USBD/CmsisViewTreeRef.txt +++ b/test-data/solutions/USBD/CmsisViewTreeRef.txt @@ -145,9 +145,10 @@ solution label=ARM::CMSIS:OS Tick:SysTick expandable=1 iconPath=csolution-software-component + features=component;headerFile: + projectUri=TEST_DIR/solutions/USBD/HID/HID.cproject.yml tooltip=- component: ` ARM::CMSIS:OS Tick:SysTick@1.0.5 ` - from pack: ` ARM::CMSIS@6.1.0 ` - features=headerFile: header=os_tick.h file label=os_systick.c @@ -164,7 +165,8 @@ solution label=ARM::CMSIS:RTOS2:Keil RTX5&Source expandable=1 iconPath=csolution-software-component - features=docFile:;headerFile: + features=component;docFile:;headerFile: + projectUri=TEST_DIR/solutions/USBD/HID/HID.cproject.yml type=docFile docPath=${CMSIS_PACK_ROOT}/ARM/CMSIS-RTX/5.9.0/Documentation/index.html tooltip=- component: ` ARM::CMSIS:RTOS2:Keil RTX5&Source@5.9.0 ` @@ -255,9 +257,10 @@ solution label=Keil::USB&MDK:CORE expandable=1 iconPath=csolution-software-component + features=component;headerFile: + projectUri=TEST_DIR/solutions/USBD/HID/HID.cproject.yml tooltip=- component: ` Keil::USB&MDK:CORE@8.0.0 ` - from pack: ` Keil::MDK-Middleware@8.0.0-dev ` - features=headerFile: header=rl_usb.h file label=rl_usb.h @@ -279,7 +282,8 @@ solution label=Keil::USB&MDK:Device expandable=1 iconPath=csolution-software-component - features=docFile:;headerFile: + features=component;docFile:;headerFile: + projectUri=TEST_DIR/solutions/USBD/HID/HID.cproject.yml type=docFile docPath=TEST_DIR/MyLocalPath/MDK-Middleware/Documentation/html/USB/USB_Device.html tooltip=- component: ` Keil::USB&MDK:Device@8.0.0 ` @@ -315,7 +319,8 @@ solution label=Keil::USB&MDK:Device:HID expandable=1 iconPath=csolution-software-component - features=docFile:;headerFile: + features=component;docFile:;headerFile: + projectUri=TEST_DIR/solutions/USBD/HID/HID.cproject.yml type=docFile docPath=TEST_DIR/MyLocalPath/MDK-Middleware/Documentation/html/USB/USB_Classes.html#HID tooltip=- component: ` Keil::USB&MDK:Device:HID@8.0.0 ` @@ -379,7 +384,8 @@ solution label=Keil::Device:CubeMX expandable=1 iconPath=csolution-software-component - features=component-gen + features=component;component-gen + layerUri=TEST_DIR/solutions/USBD/Board/B-U585I-IOT02A/Board.clayer.yml type=component-gen generator=CubeMX cbuild-context=HID.Release+B-U585I-IOT02A @@ -646,7 +652,8 @@ solution label=ARM::CMSIS:CORE expandable=1 iconPath=csolution-software-component - features=docFile:;headerFile: + features=component;docFile:;headerFile: + layerUri=TEST_DIR/solutions/USBD/Board/B-U585I-IOT02A/Board.clayer.yml type=docFile docPath=${CMSIS_PACK_ROOT}/ARM/CMSIS/6.1.0/CMSIS/Documentation/html/Core/index.html tooltip=- component: ` ARM::CMSIS:CORE@6.1.0 ` @@ -662,7 +669,8 @@ solution label=Keil::CMSIS Driver:USART expandable=1 iconPath=csolution-software-component - features=docFile:;headerFile: + features=component;docFile:;headerFile: + layerUri=TEST_DIR/solutions/USBD/Board/B-U585I-IOT02A/Board.clayer.yml type=docFile docPath=TEST_DIR/MyLocalPath/CMSIS-Driver_STM32/Documentation/html/usart_stm32.html tooltip=- component: ` Keil::CMSIS Driver:USART@3.0.0 ` @@ -691,7 +699,8 @@ solution label=Keil::CMSIS Driver:USB Device expandable=1 iconPath=csolution-software-component - features=docFile:;headerFile: + features=component;docFile:;headerFile: + layerUri=TEST_DIR/solutions/USBD/Board/B-U585I-IOT02A/Board.clayer.yml type=docFile docPath=TEST_DIR/MyLocalPath/CMSIS-Driver_STM32/Documentation/html/usbd_stm32.html tooltip=- component: ` Keil::CMSIS Driver:USB Device@3.0.0 ` @@ -720,9 +729,10 @@ solution label=Keil::CMSIS Driver:VIO:Board&B-U585I-IOT02A expandable=1 iconPath=csolution-software-component + features=component;headerFile: + layerUri=TEST_DIR/solutions/USBD/Board/B-U585I-IOT02A/Board.clayer.yml tooltip=- component: ` Keil::CMSIS Driver:VIO:Board&B-U585I-IOT02A@2.0.1 ` - from pack: ` Keil::B-U585I-IOT02A_BSP@2.0.0 ` - features=headerFile: header=cmsis_vio.h file label=cmsis_vio.h @@ -741,6 +751,8 @@ solution label=ARM::CMSIS-Compiler:CORE expandable=1 iconPath=csolution-software-component + features=component + layerUri=TEST_DIR/solutions/USBD/Board/B-U585I-IOT02A/Board.clayer.yml tooltip=- component: ` ARM::CMSIS-Compiler:CORE@1.1.0 ` - from pack: ` ARM::CMSIS-Compiler@2.1.0 ` file @@ -751,9 +763,10 @@ solution label=ARM::CMSIS-Compiler:STDERR:Custom expandable=1 iconPath=csolution-software-component + features=component;headerFile: + layerUri=TEST_DIR/solutions/USBD/Board/B-U585I-IOT02A/Board.clayer.yml tooltip=- component: ` ARM::CMSIS-Compiler:STDERR:Custom@1.1.0 ` - from pack: ` ARM::CMSIS-Compiler@2.1.0 ` - features=headerFile: header=retarget_stderr.h file label=retarget_stderr.h @@ -766,9 +779,10 @@ solution label=ARM::CMSIS-Compiler:STDOUT:Custom expandable=1 iconPath=csolution-software-component + features=component;headerFile: + layerUri=TEST_DIR/solutions/USBD/Board/B-U585I-IOT02A/Board.clayer.yml tooltip=- component: ` ARM::CMSIS-Compiler:STDOUT:Custom@1.1.0 ` - from pack: ` ARM::CMSIS-Compiler@2.1.0 ` - features=headerFile: header=retarget_stdout.h file label=retarget_stdout.h @@ -781,9 +795,10 @@ solution label=ARM::CMSIS-Compiler:STDIN:Custom expandable=1 iconPath=csolution-software-component + features=component;headerFile: + layerUri=TEST_DIR/solutions/USBD/Board/B-U585I-IOT02A/Board.clayer.yml tooltip=- component: ` ARM::CMSIS-Compiler:STDIN:Custom@1.1.0 ` - from pack: ` ARM::CMSIS-Compiler@2.1.0 ` - features=headerFile: header=retarget_stdin.h file label=retarget_stdin.h @@ -881,9 +896,10 @@ solution label=ARM::CMSIS:OS Tick:SysTick expandable=1 iconPath=csolution-software-component + features=component;headerFile: + projectUri=TEST_DIR/solutions/USBD/MassStorage/MassStorage.cproject.yml tooltip=- component: ` ARM::CMSIS:OS Tick:SysTick@1.0.5 ` - from pack: ` ARM::CMSIS@6.1.0 ` - features=headerFile: header=os_tick.h file label=os_systick.c @@ -900,7 +916,8 @@ solution label=ARM::CMSIS:RTOS2:Keil RTX5&Source expandable=1 iconPath=csolution-software-component - features=docFile:;headerFile: + features=component;docFile:;headerFile: + projectUri=TEST_DIR/solutions/USBD/MassStorage/MassStorage.cproject.yml type=docFile docPath=${CMSIS_PACK_ROOT}/ARM/CMSIS-RTX/5.9.0/Documentation/index.html tooltip=- component: ` ARM::CMSIS:RTOS2:Keil RTX5&Source@5.9.0 ` @@ -991,9 +1008,10 @@ solution label=Keil::USB&MDK:CORE expandable=1 iconPath=csolution-software-component + features=component;headerFile: + projectUri=TEST_DIR/solutions/USBD/MassStorage/MassStorage.cproject.yml tooltip=- component: ` Keil::USB&MDK:CORE@8.0.0 ` - from pack: ` Keil::MDK-Middleware@8.0.0-dev ` - features=headerFile: header=rl_usb.h file label=rl_usb.h @@ -1015,7 +1033,8 @@ solution label=Keil::USB&MDK:Device expandable=1 iconPath=csolution-software-component - features=docFile:;headerFile: + features=component;docFile:;headerFile: + projectUri=TEST_DIR/solutions/USBD/MassStorage/MassStorage.cproject.yml type=docFile docPath=TEST_DIR/MyLocalPath/MDK-Middleware/Documentation/html/USB/USB_Device.html tooltip=- component: ` Keil::USB&MDK:Device@8.0.0 ` @@ -1051,7 +1070,8 @@ solution label=Keil::USB&MDK:Device:MSC expandable=1 iconPath=csolution-software-component - features=docFile:;headerFile: + features=component;docFile:;headerFile: + projectUri=TEST_DIR/solutions/USBD/MassStorage/MassStorage.cproject.yml type=docFile docPath=TEST_DIR/MyLocalPath/MDK-Middleware/Documentation/html/USB/USB_Classes.html#MSC tooltip=- component: ` Keil::USB&MDK:Device:MSC@8.0.0 ` @@ -1115,7 +1135,8 @@ solution label=Keil::Device:CubeMX expandable=1 iconPath=csolution-software-component - features=component-gen + features=component;component-gen + layerUri=TEST_DIR/solutions/USBD/Board/B-U585I-IOT02A/Board.clayer.yml type=component-gen generator=CubeMX cbuild-context=MassStorage.Debug+B-U585I-IOT02A @@ -1382,7 +1403,8 @@ solution label=ARM::CMSIS:CORE expandable=1 iconPath=csolution-software-component - features=docFile:;headerFile: + features=component;docFile:;headerFile: + layerUri=TEST_DIR/solutions/USBD/Board/B-U585I-IOT02A/Board.clayer.yml type=docFile docPath=${CMSIS_PACK_ROOT}/ARM/CMSIS/6.1.0/CMSIS/Documentation/html/Core/index.html tooltip=- component: ` ARM::CMSIS:CORE@6.1.0 ` @@ -1398,7 +1420,8 @@ solution label=Keil::CMSIS Driver:USART expandable=1 iconPath=csolution-software-component - features=docFile:;headerFile: + features=component;docFile:;headerFile: + layerUri=TEST_DIR/solutions/USBD/Board/B-U585I-IOT02A/Board.clayer.yml type=docFile docPath=TEST_DIR/MyLocalPath/CMSIS-Driver_STM32/Documentation/html/usart_stm32.html tooltip=- component: ` Keil::CMSIS Driver:USART@3.0.0 ` @@ -1427,7 +1450,8 @@ solution label=Keil::CMSIS Driver:USB Device expandable=1 iconPath=csolution-software-component - features=docFile:;headerFile: + features=component;docFile:;headerFile: + layerUri=TEST_DIR/solutions/USBD/Board/B-U585I-IOT02A/Board.clayer.yml type=docFile docPath=TEST_DIR/MyLocalPath/CMSIS-Driver_STM32/Documentation/html/usbd_stm32.html tooltip=- component: ` Keil::CMSIS Driver:USB Device@3.0.0 ` @@ -1456,9 +1480,10 @@ solution label=Keil::CMSIS Driver:VIO:Board&B-U585I-IOT02A expandable=1 iconPath=csolution-software-component + features=component;headerFile: + layerUri=TEST_DIR/solutions/USBD/Board/B-U585I-IOT02A/Board.clayer.yml tooltip=- component: ` Keil::CMSIS Driver:VIO:Board&B-U585I-IOT02A@2.0.1 ` - from pack: ` Keil::B-U585I-IOT02A_BSP@2.0.0 ` - features=headerFile: header=cmsis_vio.h file label=cmsis_vio.h @@ -1477,6 +1502,8 @@ solution label=ARM::CMSIS-Compiler:CORE expandable=1 iconPath=csolution-software-component + features=component + layerUri=TEST_DIR/solutions/USBD/Board/B-U585I-IOT02A/Board.clayer.yml tooltip=- component: ` ARM::CMSIS-Compiler:CORE@1.1.0 ` - from pack: ` ARM::CMSIS-Compiler@2.1.0 ` file @@ -1487,9 +1514,10 @@ solution label=ARM::CMSIS-Compiler:STDERR:Custom expandable=1 iconPath=csolution-software-component + features=component;headerFile: + layerUri=TEST_DIR/solutions/USBD/Board/B-U585I-IOT02A/Board.clayer.yml tooltip=- component: ` ARM::CMSIS-Compiler:STDERR:Custom@1.1.0 ` - from pack: ` ARM::CMSIS-Compiler@2.1.0 ` - features=headerFile: header=retarget_stderr.h file label=retarget_stderr.h @@ -1502,9 +1530,10 @@ solution label=ARM::CMSIS-Compiler:STDOUT:Custom expandable=1 iconPath=csolution-software-component + features=component;headerFile: + layerUri=TEST_DIR/solutions/USBD/Board/B-U585I-IOT02A/Board.clayer.yml tooltip=- component: ` ARM::CMSIS-Compiler:STDOUT:Custom@1.1.0 ` - from pack: ` ARM::CMSIS-Compiler@2.1.0 ` - features=headerFile: header=retarget_stdout.h file label=retarget_stdout.h @@ -1517,9 +1546,10 @@ solution label=ARM::CMSIS-Compiler:STDIN:Custom expandable=1 iconPath=csolution-software-component + features=component;headerFile: + layerUri=TEST_DIR/solutions/USBD/Board/B-U585I-IOT02A/Board.clayer.yml tooltip=- component: ` ARM::CMSIS-Compiler:STDIN:Custom@1.1.0 ` - from pack: ` ARM::CMSIS-Compiler@2.1.0 ` - features=headerFile: header=retarget_stdin.h file label=retarget_stdin.h