commit 09d1685aa9b230da369e8a3559686a7bab10e154 Author: Christoph Brandau Date: Tue Jan 7 10:22:59 2025 +0100 init project diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b512c09 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..e0b27b7 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,30 @@ +// A launch configuration that compiles the extension and then opens it inside a new window +// Use IntelliSense to learn about possible attributes. +// Hover to view descriptions of existing attributes. +// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Run Extension", + "type": "extensionHost", + "request": "launch", + "runtimeExecutable": "${execPath}", + "args": ["--extensionDevelopmentPath=${workspaceFolder}"], + "outFiles": ["${workspaceFolder}/out/**/*.js"], + "preLaunchTask": "npm: watch" + }, + { + "name": "Extension Tests", + "type": "extensionHost", + "request": "launch", + "runtimeExecutable": "${execPath}", + "args": [ + "--extensionDevelopmentPath=${workspaceFolder}", + "--extensionTestsPath=${workspaceFolder}/out/test" + ], + "outFiles": ["${workspaceFolder}/out/test/**/*.js"], + "preLaunchTask": "npm: watch" + } + ] +} diff --git a/.vscodeignore b/.vscodeignore new file mode 100644 index 0000000..f369b5e --- /dev/null +++ b/.vscodeignore @@ -0,0 +1,4 @@ +.vscode/** +.vscode-test/** +.gitignore +vsc-extension-quickstart.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..e6097c2 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,9 @@ +# Change Log + +All notable changes to the "cdl" extension will be documented in this file. + +Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file. + +## [Unreleased] + +- Initial release \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..ef92530 --- /dev/null +++ b/README.md @@ -0,0 +1,65 @@ +# cdl README + +This is the README for your extension "cdl". After writing up a brief description, we recommend including the following sections. + +## Features + +Describe specific features of your extension including screenshots of your extension in action. Image paths are relative to this README file. + +For example if there is an image subfolder under your extension project workspace: + +\!\[feature X\]\(images/feature-x.png\) + +> Tip: Many popular extensions utilize animations. This is an excellent way to show off your extension! We recommend short, focused animations that are easy to follow. + +## Requirements + +If you have any requirements or dependencies, add a section describing those and how to install and configure them. + +## Extension Settings + +Include if your extension adds any VS Code settings through the `contributes.configuration` extension point. + +For example: + +This extension contributes the following settings: + +* `myExtension.enable`: Enable/disable this extension. +* `myExtension.thing`: Set to `blah` to do something. + +## Known Issues + +Calling out known issues can help limit users opening duplicate issues against your extension. + +## Release Notes + +Users appreciate release notes as you update your extension. + +### 1.0.0 + +Initial release of ... + +### 1.0.1 + +Fixed issue #. + +### 1.1.0 + +Added features X, Y, and Z. + +--- + +## Working with Markdown + +You can author your README using Visual Studio Code. Here are some useful editor keyboard shortcuts: + +* Split the editor (`Cmd+\` on macOS or `Ctrl+\` on Windows and Linux). +* Toggle preview (`Shift+Cmd+V` on macOS or `Shift+Ctrl+V` on Windows and Linux). +* Press `Ctrl+Space` (Windows, Linux, macOS) to see a list of Markdown snippets. + +## For more information + +* [Visual Studio Code's Markdown Support](http://code.visualstudio.com/docs/languages/markdown) +* [Markdown Syntax Reference](https://help.github.com/articles/markdown-basics/) + +**Enjoy!** diff --git a/client/out/src/common/handlers.js b/client/out/src/common/handlers.js new file mode 100644 index 0000000..812962b --- /dev/null +++ b/client/out/src/common/handlers.js @@ -0,0 +1,18 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.formatCdlFile = formatCdlFile; +function formatCdlFile(content) { + let indentLevel = 0; + const formattedLines = []; + for (const line of content.split("\n")) { + const strippedLine = line.trim(); + if (strippedLine.endsWith("}")) { + indentLevel = Math.max(indentLevel - 1, 0); + } + formattedLines.push(" ".repeat(indentLevel) + strippedLine); + if (strippedLine.endsWith("{")) { + indentLevel += 1; + } + } + return formattedLines.join("\n"); +} diff --git a/client/out/src/extension.js b/client/out/src/extension.js new file mode 100644 index 0000000..ba7631f --- /dev/null +++ b/client/out/src/extension.js @@ -0,0 +1,51 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +exports.activate = activate; +exports.deactivate = deactivate; +const vscode = __importStar(require("vscode")); +const handlers_1 = require("./common/handlers"); +function activate(context) { + const disposable = vscode.languages.registerDocumentFormattingEditProvider({ scheme: "file", language: "cdl" }, { + provideDocumentFormattingEdits(document) { + const text = document.getText(); + const formattedText = (0, handlers_1.formatCdlFile)(text); + const fullRange = new vscode.Range(document.positionAt(0), document.positionAt(text.length)); + return [vscode.TextEdit.replace(fullRange, formattedText)]; + }, + }); + context.subscriptions.push(disposable); +} +function deactivate() { } diff --git a/client/src/common/handlers.ts b/client/src/common/handlers.ts new file mode 100644 index 0000000..662ab6d --- /dev/null +++ b/client/src/common/handlers.ts @@ -0,0 +1,15 @@ +export function formatCdlFile(content: string): string { + let indentLevel = 0; + const formattedLines = []; + for (const line of content.split("\n")) { + const strippedLine = line.trim(); + if (strippedLine.endsWith("}")) { + indentLevel = Math.max(indentLevel - 1, 0); + } + formattedLines.push(" ".repeat(indentLevel) + strippedLine); + if (strippedLine.endsWith("{")) { + indentLevel += 1; + } + } + return formattedLines.join("\n"); +} diff --git a/client/src/extension.ts b/client/src/extension.ts new file mode 100644 index 0000000..bc0a821 --- /dev/null +++ b/client/src/extension.ts @@ -0,0 +1,25 @@ +import * as vscode from "vscode"; +import { formatCdlFile } from "./common/handlers"; + +export function activate(context: vscode.ExtensionContext) { + const disposable = vscode.languages.registerDocumentFormattingEditProvider( + { scheme: "file", language: "cdl" }, + { + provideDocumentFormattingEdits( + document: vscode.TextDocument + ): vscode.TextEdit[] { + const text = document.getText(); + const formattedText = formatCdlFile(text); + const fullRange = new vscode.Range( + document.positionAt(0), + document.positionAt(text.length) + ); + return [vscode.TextEdit.replace(fullRange, formattedText)]; + }, + } + ); + + context.subscriptions.push(disposable); +} + +export function deactivate() {} diff --git a/language-configuration.json b/language-configuration.json new file mode 100644 index 0000000..3fc3265 --- /dev/null +++ b/language-configuration.json @@ -0,0 +1,28 @@ +{ + "comments": { + // symbol used for single line comment. Remove this entry if your language does not support line comments + "lineComment": "#" + }, + // symbols used as brackets + "brackets": [ + ["{", "}"], + ["[", "]"], + ["(", ")"] + ], + // symbols that are auto closed when typing + "autoClosingPairs": [ + ["{", "}"], + ["[", "]"], + ["(", ")"], + ["\"", "\""], + ["'", "'"] + ], + // symbols that can be used to surround a selection + "surroundingPairs": [ + ["{", "}"], + ["[", "]"], + ["(", ")"], + ["\"", "\""], + ["'", "'"] + ] +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..7a86c13 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,40 @@ +{ + "name": "cdl", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "cdl", + "version": "0.0.1", + "devDependencies": { + "@types/vscode": "^1.96.0", + "typescript": "^5.7.2" + }, + "engines": { + "vscode": "^1.96.0" + } + }, + "node_modules/@types/vscode": { + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.96.0.tgz", + "integrity": "sha512-qvZbSZo+K4ZYmmDuaodMbAa67Pl6VDQzLKFka6rq+3WUTY4Kro7Bwoi0CuZLO/wema0ygcmpwow7zZfPJTs5jg==", + "dev": true, + "license": "MIT" + }, + "node_modules/typescript": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", + "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..c75da6a --- /dev/null +++ b/package.json @@ -0,0 +1,47 @@ +{ + "name": "cdl", + "displayName": "vscode-cdl-support", + "description": "", + "version": "0.0.1", + "main": "./client/out/src/extension.js", + "keywords": [ + "cdl", + "NX CDL", + "UDE" + ], + "engines": { + "vscode": "^1.96.0" + }, + "categories": [ + "Programming Languages" + ], + "contributes": { + "languages": [ + { + "id": "cdl", + "aliases": [ + "NX CDL", + "cdl" + ], + "extensions": [ + ".cdl" + ], + "configuration": "./language-configuration.json" + } + ], + "grammars": [ + { + "language": "cdl", + "scopeName": "source.cdl", + "path": "./syntaxes/cdl.tmLanguage.json" + } + ] + }, + "scripts": { + "watch": "tsc -watch -p ./" + }, + "devDependencies": { + "@types/vscode": "^1.96.0", + "typescript": "^5.7.2" + } +} \ No newline at end of file diff --git a/syntaxes/cdl.tmLanguage.json b/syntaxes/cdl.tmLanguage.json new file mode 100644 index 0000000..46a0a60 --- /dev/null +++ b/syntaxes/cdl.tmLanguage.json @@ -0,0 +1,95 @@ +{ + "$schema": "https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json", + "name": "CDL Support", + "patterns": [ + { + "include": "#comment" + }, + { + "include": "#variables" + }, + { + "include": "#types" + }, + { + "include": "#keywords" + }, + { + "include": "#strings" + } + ], + "repository": { + "keywords": { + "patterns": [ + { + "name": "keyword.control.cdl", + "match": "\\b(UI_LABEL|PARAM|EVENT|POST_EVENT|DEFVAL|CATEGORY|TYPE|OPTIONS|UI_HELP|MACHINE|TOGGLE)\\b" + } + ] + }, + "strings": { + "name": "string.quoted.double.cdl", + "begin": "\"", + "end": "\"", + "patterns": [ + { + "name": "constant.character.escape.cdl", + "match": "\\\\." + } + ] + }, + "types": { + "patterns": [ + { + "name": "keyword.control.cdl", + "match": "TYPE\\s+(o|g|i|d|b|s)\\b", + "captures": { + "1": { + "name": "storage.type.cs" + } + } + } + ] + }, + "variables": { + "patterns": [ + { + "name": "keyword.control.cdl", + "match": "\\b(PARAM|EVENT)\\s+([a-zA-Z_]\\w*)\\b", + "captures": { + "2": { + "name": "variable.other.cdl" + } + } + }, + { + "name": "keyword.control.cdl", + "match": "\\bMACHINE\\s+([a-zA-Z_]\\w*)\\b", + "captures": { + "1": { + "name": "variable.other.cdl" + } + } + }, + { + "name": "keyword.control.cdl", + "match": "\\bCATEGORY\\s+((MILL|LATHE|DRILL)(\\s+(MILL|LATHE|DRILL))*)\\b", + "captures": { + "1": { + "name": "variable.language.cdl" + } + } + } + ] + }, + "comment": { + "patterns": [ + { + "name": "comment.line.cdl", + "match": "#.*" + } + ] + } + }, + "scopeName": "source.cdl" +} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..924b2b0 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "target": "es6", + "lib": ["es6"], + "module": "commonjs", + "outDir": "client/out", + "rootDir": "client", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true + }, + "exclude": ["node_modules", ".vscode-test"] +} diff --git a/vsc-extension-quickstart.md b/vsc-extension-quickstart.md new file mode 100644 index 0000000..75eae12 --- /dev/null +++ b/vsc-extension-quickstart.md @@ -0,0 +1,29 @@ +# Welcome to your VS Code Extension + +## What's in the folder + +* This folder contains all of the files necessary for your extension. +* `package.json` - this is the manifest file in which you declare your language support and define the location of the grammar file that has been copied into your extension. +* `syntaxes/cdl.tmLanguage.json` - this is the Text mate grammar file that is used for tokenization. +* `language-configuration.json` - this is the language configuration, defining the tokens that are used for comments and brackets. + +## Get up and running straight away + +* Make sure the language configuration settings in `language-configuration.json` are accurate. +* Press `F5` to open a new window with your extension loaded. +* Create a new file with a file name suffix matching your language. +* Verify that syntax highlighting works and that the language configuration settings are working. + +## Make changes + +* You can relaunch the extension from the debug toolbar after making changes to the files listed above. +* You can also reload (`Ctrl+R` or `Cmd+R` on Mac) the VS Code window with your extension to load your changes. + +## Add more language features + +* To add features such as IntelliSense, hovers and validators check out the VS Code extenders documentation at https://code.visualstudio.com/docs + +## Install your extension + +* To start using your extension with Visual Studio Code copy it into the `/.vscode/extensions` folder and restart Code. +* To share your extension with the world, read on https://code.visualstudio.com/docs about publishing an extension.