Compare commits

...

12 Commits

Author SHA1 Message Date
me
d3d99fa223 - 2026-01-29 20:32:59 +08:00
me
de68ced39e feat: add official Slint SVG icons with theme support
- Downloaded official SVG icons from Slint repository
- Added square logos for file type icons (light and dark variants)
- Added full logos for larger display areas
- Implemented automatic theme switching (slintFile.svg / slintFile_dark.svg)
- Replaced old PNG icon with scalable SVG icons
- Updated SlintIcons to use IconLoader for proper SVG support

Icons now properly display in IntelliJ and adapt to light/dark themes.
2026-01-29 18:24:05 +08:00
me
17da3f6f0e fix: resolve configuration cache issue in processLspResources task
Changed processLspResources from a generic task with doLast block to a proper Copy task. This eliminates Gradle script object references that were incompatible with configuration cache.

- Converted to Copy task type
- Moved copy logic from doLast to task configuration
- Maintains same functionality while being configuration cache compatible
2026-01-29 15:04:36 +08:00
me
5203c1791c docs: add testing instructions to CLAUDE.md 2026-01-29 14:16:17 +08:00
me
2a4ad9c7f2 test: add sample Slint file and test results template
Add test files for manual verification of the Slint LSP integration:
- hello.slint: Sample Slint component with common UI elements
- TEST_RESULTS.md: Checklist template for testing LSP features

Co-Authored-By: Claude (auto) <noreply@anthropic.com>
2026-01-29 14:12:08 +08:00
me
7ec9a01c78 feat: register TextMate bundle provider in plugin.xml
Co-Authored-By: Claude (auto) <noreply@anthropic.com>
2026-01-29 13:42:03 +08:00
me
6c43bad220 feat: add TextMate bundle provider for Slint syntax highlighting
This provider loads the Slint TextMate grammar file and registers it with
IntelliJ's TextMate system. Also adds the required textmate plugin dependency
to build.gradle.kts.

Co-Authored-By: Claude (auto) <noreply@anthropic.com>
2026-01-29 13:34:28 +08:00
me
69b6cfe8a3 feat: add Slint TextMate grammar for syntax highlighting 2026-01-29 13:22:12 +08:00
me
198af79707 refactor: use SlintFileType for type-safe file detection
Co-Authored-By: Claude (auto) <noreply@anthropic.com>
2026-01-29 13:16:35 +08:00
me
2d8f817cd2 feat: register Slint file type in plugin.xml
Co-Authored-By: Claude (auto) <noreply@anthropic.com>
2026-01-29 13:02:38 +08:00
me
ec88840dc8 feat: add Slint file type definition
Co-Authored-By: Claude (auto) <noreply@anthropic.com>
2026-01-29 12:56:16 +08:00
me
6ee9681ea5 feat: add Slint language definition 2026-01-29 12:53:33 +08:00
108 changed files with 18441 additions and 33 deletions

127
CLAUDE.md Normal file
View File

@@ -0,0 +1,127 @@
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Project Overview
This is an IntelliJ IDEA plugin that provides Slint language support through LSP (Language Server Protocol) integration. The plugin downloads platform-specific Slint LSP binaries from GitHub releases and integrates them with IntelliJ's LSP infrastructure.
## Build System
This project uses Gradle with the Kotlin DSL and the IntelliJ Platform Gradle Plugin.
### Common Commands
**Build the plugin:**
```bash
./gradlew build
```
**Run the plugin in a sandbox IDE:**
```bash
./gradlew runIde
```
**Run tests:**
```bash
./gradlew test
```
**Verify plugin compatibility:**
```bash
./gradlew verifyPlugin
```
**Build plugin distribution ZIP:**
```bash
./gradlew buildPlugin
```
**Clean build artifacts:**
```bash
./gradlew clean
```
## Architecture
### LSP Integration
The plugin uses IntelliJ's LSP support (`com.intellij.modules.lsp`) to provide language features for `.slint` files.
**Key components:**
- `SlintLspServerSupportProvider` (src/main/kotlin/me/zhouxi/slint/lsp/SlintLspServerSupportProvider.kt:13): Main LSP integration point. Implements `LspServerSupportProvider` to start the Slint LSP server when `.slint` files are opened.
- `SlintRuntime` (src/main/kotlin/me/zhouxi/slint/SlintRuntime.kt:8): Manages plugin paths and locates the platform-specific LSP binary. Detects OS (Windows/Linux/macOS) and resolves the correct executable path.
- `FooLspServerDescriptor` (src/main/kotlin/me/zhouxi/slint/lsp/SlintLspServerSupportProvider.kt:34): Internal descriptor that creates the command line for launching the LSP server.
### Binary Distribution
The build process downloads platform-specific Slint LSP binaries from GitHub releases:
- **Download task** (build.gradle.kts:72-79): Downloads LSP binaries for Linux, macOS, and Windows from `https://github.com/slint-ui/slint/releases/download/v{version}/`
- **Extract task** (build.gradle.kts:80-104): Extracts and renames binaries to standardized names (`slint-lsp-linux`, `slint-lsp-macos`, `slint-lsp-windows.exe`)
- **Sandbox preparation** (build.gradle.kts:105-111): Copies extracted binaries to `slint/lsp/` directory in the plugin sandbox
The Slint version is configured in `gradle.properties` via the `slintVersion` property.
### Plugin Configuration
- **plugin.xml** (src/main/resources/META-INF/plugin.xml): Declares the plugin metadata, dependencies, and extension points. Registers `SlintLspServerSupportProvider` as the LSP server support provider.
- **Target IDE version**: IntelliJ IDEA 2025.2.4 with minimum build 252.25557 (configured in build.gradle.kts:43,56)
- **Java/Kotlin version**: JVM 21 (build.gradle.kts:68-70,114-118)
## Project Structure
```
src/main/kotlin/me/zhouxi/slint/
├── SlintRuntime.kt # Plugin runtime and binary path resolution
├── icons/SlintIcons.kt # Icon resources for UI
└── lsp/
└── SlintLspServerSupportProvider.kt # LSP integration
```
## Testing the Plugin
### Manual Testing
1. **Build and run in sandbox:**
```bash
./gradlew runIde
```
2. **Test with sample file:**
- Open `test-files/hello.slint`
- Verify file icon, syntax highlighting, and LSP features
3. **Test LSP features:**
- Code completion: Type and press Ctrl+Space
- Goto definition: Ctrl+Click on symbols
- Hover: Mouse over symbols
- Diagnostics: Introduce syntax errors
- Formatting: Ctrl+Alt+L
### Verify LSP Server
Check LSP server status in the status bar (bottom right). Should show "Slint" when a .slint file is open.
### Common Issues
- **LSP server not starting**: Check that LSP binary exists in sandbox at `sandbox/plugins/slint/lsp/slint-lsp-{platform}`
- **No syntax highlighting**: Verify TextMate grammar file is in resources
- **No completion**: Check LSP server logs in `idea.log`
## Development Notes
- The plugin uses IntelliJ's built-in LSP client infrastructure, so language features (completion, diagnostics, etc.) are provided by the Slint LSP server itself.
- The sandbox directory is configured to `sandbox/` in the project root (build.gradle.kts:53).
- When modifying LSP integration, test by running `./gradlew runIde` which launches a sandbox IDE with the plugin installed.
- To update the Slint LSP version, change `slintVersion` in `gradle.properties` and rebuild. The build will download new binaries automatically.

View File

@@ -44,7 +44,7 @@ dependencies {
testFramework(TestFrameworkType.Platform)
// Add plugin dependencies for compilation here:
bundledPlugin("org.jetbrains.plugins.textmate")
}
}
@@ -77,30 +77,24 @@ tasks {
onlyIfModified(true)
}
}
val processLspResources by registering {
val processLspResources by registering(Copy::class) {
dependsOn(downloadTasks)
inputs.dir(downloadDir)
outputs.dir(extractedDir)
doLast {
slintViewerFilenames.forEach { (filename, renamed) ->
val fileTarget = downloadDir.get().file(filename)
copy {
val fileTree = if (filename.endsWith("zip")) zipTree(fileTarget) else tarTree(fileTarget)
from(fileTree) {
// 匹配压缩包内的 slint-lsp 文件夹及其内容
include("**/slint-lsp*")
// 展平目录并重命名
eachFile {
path = renamed
}
includeEmptyDirs = false
}
into(extractedDir)
slintViewerFilenames.forEach { (filename, renamed) ->
val fileTarget = downloadDir.get().file(filename)
val fileTree = if (filename.endsWith("zip")) zipTree(fileTarget) else tarTree(fileTarget)
from(fileTree) {
// 匹配压缩包内的 slint-lsp 文件夹及其内容
include("**/slint-lsp*")
// 展平目录并重命名
eachFile {
path = renamed
}
includeEmptyDirs = false
}
}
into(extractedDir)
}
prepareSandbox {
dependsOn(processLspResources)

View File

@@ -0,0 +1,108 @@
# Slint LSP Integration Design
**Date:** 2026-01-29
**Status:** Approved
**Phase:** Phase 1 - Core LSP Features
## Overview
Implement complete Slint LSP integration into IntelliJ IDEA, enabling standard LSP features (diagnostics, completion, goto definition, hover, formatting, etc.) through IntelliJ's built-in LSP framework.
## Architecture
### Component Structure
```
IntelliJ IDEA (LSP Client)
SlintLspServerSupportProvider (Entry point)
SlintLspServerDescriptor (Server configuration)
Slint LSP Server (External process)
```
### Core Components
1. **File Type System**
- `SlintLanguage`: Language definition
- `SlintFileType`: File type definition with .slint extension
- File icon and description
2. **LSP Server Integration**
- `SlintLspServerSupportProvider`: LSP entry point (exists, needs refinement)
- `SlintLspServerDescriptor`: Server configuration (rename from FooLspServerDescriptor)
- Automatic capability negotiation via LSP initialize handshake
3. **Syntax Highlighting**
- Use TextMate grammar from official Slint VSCode extension
- `SlintTextMateProvider`: TextMate bundle provider
4. **LSP Feature Mapping** (automatic via IntelliJ)
- Diagnostics → Error/warning annotations
- Completion → Code completion UI
- Goto Definition → Ctrl+Click navigation
- Hover → Quick documentation
- Formatting → Code formatting actions
- References → Find usages
- Rename → Refactor rename
## Implementation Plan
### 1. File Type System
**Files to create:**
- `src/main/kotlin/me/zhouxi/slint/lang/SlintLanguage.kt`
- `src/main/kotlin/me/zhouxi/slint/lang/SlintFileType.kt`
**Changes to plugin.xml:**
- Register `<fileType>` extension
### 2. LSP Server Configuration
**Files to modify:**
- `src/main/kotlin/me/zhouxi/slint/lsp/SlintLspServerSupportProvider.kt`
- Rename `FooLspServerDescriptor``SlintLspServerDescriptor`
- Use `file.fileType == SlintFileType` instead of string comparison
### 3. Syntax Highlighting
**Resources to add:**
- Download `slint.tmLanguage.json` from Slint GitHub
- Place in `src/main/resources/textmate/`
**Files to create:**
- `src/main/kotlin/me/zhouxi/slint/lang/syntax/SlintTextMateProvider.kt`
**Changes to plugin.xml:**
- Register `<textMate.bundleProvider>` extension
### 4. Testing
**Test files to create:**
- Sample .slint files for manual testing
- Verify: diagnostics, completion, goto definition, hover, formatting
## Design Decisions
- **Use IntelliJ LSP Framework**: Leverage built-in LSP client, no manual protocol implementation
- **TextMate for Syntax**: Use official grammar, zero maintenance
- **Minimal Custom Code**: Only implement required extension points
- **Type-Safe File Detection**: Use FileType comparison instead of string extension checks
## Out of Scope (Phase 2)
- Live Preview integration (Slint-specific feature)
- Custom UI components
- Advanced project configuration
## Success Criteria
- .slint files recognized by IntelliJ
- LSP server starts automatically when .slint file opened
- Syntax highlighting works
- Code completion provides suggestions
- Diagnostics show errors/warnings
- Goto definition navigates correctly
- Hover shows documentation
- Code formatting works

View File

@@ -0,0 +1,547 @@
# Slint LSP Integration Implementation Plan
> **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task.
**Goal:** Implement complete Slint LSP integration into IntelliJ IDEA with file type system, LSP server configuration, and syntax highlighting.
**Architecture:** Use IntelliJ's built-in LSP framework to connect to Slint LSP server. Register .slint file type, configure LSP server descriptor, and add TextMate-based syntax highlighting.
**Tech Stack:** Kotlin, IntelliJ Platform SDK, LSP API, TextMate grammar
---
## Task 1: Create Slint Language Definition
**Files:**
- Create: `src/main/kotlin/me/zhouxi/slint/lang/SlintLanguage.kt`
**Step 1: Create SlintLanguage object**
Create the file with this content:
```kotlin
package me.zhouxi.slint.lang
import com.intellij.lang.Language
object SlintLanguage : Language("Slint") {
override fun getDisplayName(): String = "Slint"
}
```
**Step 2: Verify compilation**
Run: `./gradlew compileKotlin`
Expected: BUILD SUCCESSFUL
**Step 3: Commit**
```bash
git add src/main/kotlin/me/zhouxi/slint/lang/SlintLanguage.kt
git commit -m "feat: add Slint language definition"
```
---
## Task 2: Create Slint File Type
**Files:**
- Create: `src/main/kotlin/me/zhouxi/slint/lang/SlintFileType.kt`
**Step 1: Create SlintFileType object**
Create the file with this content:
```kotlin
package me.zhouxi.slint.lang
import com.intellij.openapi.fileTypes.LanguageFileType
import me.zhouxi.slint.icons.SlintIcons
import javax.swing.Icon
object SlintFileType : LanguageFileType(SlintLanguage) {
override fun getName(): String = "Slint"
override fun getDescription(): String = "Slint UI file"
override fun getDefaultExtension(): String = "slint"
override fun getIcon(): Icon = SlintIcons.Primary
}
```
**Step 2: Verify compilation**
Run: `./gradlew compileKotlin`
Expected: BUILD SUCCESSFUL
**Step 3: Commit**
```bash
git add src/main/kotlin/me/zhouxi/slint/lang/SlintFileType.kt
git commit -m "feat: add Slint file type definition"
```
---
## Task 3: Register File Type in plugin.xml
**Files:**
- Modify: `src/main/resources/META-INF/plugin.xml`
**Step 1: Add fileType extension**
Add this inside the `<extensions defaultExtensionNs="com.intellij">` block:
```xml
<fileType
name="Slint"
implementationClass="me.zhouxi.slint.lang.SlintFileType"
fieldName="INSTANCE"
language="Slint"
extensions="slint"/>
```
The complete extensions block should look like:
```xml
<extensions defaultExtensionNs="com.intellij">
<fileType
name="Slint"
implementationClass="me.zhouxi.slint.lang.SlintFileType"
fieldName="INSTANCE"
language="Slint"
extensions="slint"/>
<platform.lsp.serverSupportProvider implementation="me.zhouxi.slint.lsp.SlintLspServerSupportProvider"/>
</extensions>
```
**Step 2: Verify plugin configuration**
Run: `./gradlew verifyPluginProjectConfiguration`
Expected: BUILD SUCCESSFUL
**Step 3: Commit**
```bash
git add src/main/resources/META-INF/plugin.xml
git commit -m "feat: register Slint file type in plugin.xml"
```
---
## Task 4: Update LSP Server Descriptor
**Files:**
- Modify: `src/main/kotlin/me/zhouxi/slint/lsp/SlintLspServerSupportProvider.kt`
**Step 1: Add import for SlintFileType**
Add this import at the top:
```kotlin
import me.zhouxi.slint.lang.SlintFileType
```
**Step 2: Rename FooLspServerDescriptor to SlintLspServerDescriptor**
Change line 20 from:
```kotlin
serverStarter.ensureServerStarted(FooLspServerDescriptor(project))
```
To:
```kotlin
serverStarter.ensureServerStarted(SlintLspServerDescriptor(project))
```
Change line 34 from:
```kotlin
private class FooLspServerDescriptor(project: Project) : ProjectWideLspServerDescriptor(project, "Slint") {
```
To:
```kotlin
private class SlintLspServerDescriptor(project: Project) : ProjectWideLspServerDescriptor(project, "Slint") {
```
**Step 3: Update file type checking to use SlintFileType**
Change line 19 from:
```kotlin
if (file.extension == "slint") {
```
To:
```kotlin
if (file.fileType == SlintFileType) {
```
Change line 35 from:
```kotlin
override fun isSupportedFile(file: VirtualFile) = file.extension == "slint"
```
To:
```kotlin
override fun isSupportedFile(file: VirtualFile) = file.fileType == SlintFileType
```
**Step 4: Verify compilation**
Run: `./gradlew compileKotlin`
Expected: BUILD SUCCESSFUL
**Step 5: Commit**
```bash
git add src/main/kotlin/me/zhouxi/slint/lsp/SlintLspServerSupportProvider.kt
git commit -m "refactor: use SlintFileType for type-safe file detection"
```
---
## Task 5: Download TextMate Grammar File
**Files:**
- Create: `src/main/resources/textmate/slint.tmLanguage.json`
**Step 1: Create textmate directory**
Run: `mkdir -p src/main/resources/textmate`
**Step 2: Download Slint TextMate grammar**
Run:
```bash
curl -o src/main/resources/textmate/slint.tmLanguage.json \
https://raw.githubusercontent.com/slint-ui/slint/master/editors/vscode/syntaxes/slint.tmLanguage.json
```
Expected: File downloaded successfully
**Step 3: Verify file exists and is valid JSON**
Run: `cat src/main/resources/textmate/slint.tmLanguage.json | head -20`
Expected: Should see JSON content starting with `{` and containing `"scopeName": "source.slint"`
**Step 4: Commit**
```bash
git add src/main/resources/textmate/slint.tmLanguage.json
git commit -m "feat: add Slint TextMate grammar for syntax highlighting"
```
---
## Task 6: Create TextMate Bundle Provider
**Files:**
- Create: `src/main/kotlin/me/zhouxi/slint/lang/syntax/SlintTextMateProvider.kt`
**Step 1: Create syntax directory**
Run: `mkdir -p src/main/kotlin/me/zhouxi/slint/lang/syntax`
**Step 2: Create SlintTextMateProvider class**
Create the file with this content:
```kotlin
package me.zhouxi.slint.lang.syntax
import org.jetbrains.plugins.textmate.api.TextMateBundle
import org.jetbrains.plugins.textmate.api.TextMateBundleProvider
class SlintTextMateProvider : TextMateBundleProvider {
override fun getBundles(): List<TextMateBundle> {
return listOf(
TextMateBundle(
"Slint",
"textmate/slint.tmLanguage.json",
SlintTextMateProvider::class.java.classLoader
)
)
}
}
```
**Step 3: Verify compilation**
Run: `./gradlew compileKotlin`
Expected: BUILD SUCCESSFUL
**Step 4: Commit**
```bash
git add src/main/kotlin/me/zhouxi/slint/lang/syntax/SlintTextMateProvider.kt
git commit -m "feat: add TextMate bundle provider for Slint syntax highlighting"
```
---
## Task 7: Register TextMate Bundle Provider
**Files:**
- Modify: `src/main/resources/META-INF/plugin.xml`
**Step 1: Add textMate.bundleProvider extension**
Add this inside the `<extensions defaultExtensionNs="com.intellij">` block:
```xml
<textMate.bundleProvider implementation="me.zhouxi.slint.lang.syntax.SlintTextMateProvider"/>
```
The complete extensions block should now look like:
```xml
<extensions defaultExtensionNs="com.intellij">
<fileType
name="Slint"
implementationClass="me.zhouxi.slint.lang.SlintFileType"
fieldName="INSTANCE"
language="Slint"
extensions="slint"/>
<platform.lsp.serverSupportProvider implementation="me.zhouxi.slint.lsp.SlintLspServerSupportProvider"/>
<textMate.bundleProvider implementation="me.zhouxi.slint.lang.syntax.SlintTextMateProvider"/>
</extensions>
```
**Step 2: Verify plugin configuration**
Run: `./gradlew verifyPluginProjectConfiguration`
Expected: BUILD SUCCESSFUL
**Step 3: Commit**
```bash
git add src/main/resources/META-INF/plugin.xml
git commit -m "feat: register TextMate bundle provider in plugin.xml"
```
---
## Task 8: Build and Test Plugin
**Files:**
- Create: `test-files/hello.slint` (for manual testing)
**Step 1: Create test directory and sample Slint file**
Run:
```bash
mkdir -p test-files
cat > test-files/hello.slint << 'EOF'
import { Button, VerticalBox } from "std-widgets.slint";
export component HelloWorld inherits Window {
width: 400px;
height: 300px;
VerticalBox {
alignment: center;
Text {
text: "Hello, World!";
font-size: 24px;
}
Button {
text: "Click me";
clicked => {
debug("Button clicked!");
}
}
}
}
EOF
```
**Step 2: Build the plugin**
Run: `./gradlew buildPlugin`
Expected: BUILD SUCCESSFUL, plugin ZIP created in `build/distributions/`
**Step 3: Run plugin in sandbox IDE**
Run: `./gradlew runIde`
Expected: IntelliJ IDEA opens with plugin installed
**Step 4: Manual testing checklist**
In the sandbox IDE:
1. Open `test-files/hello.slint`
2. Verify: File icon shows Slint logo
3. Verify: Syntax highlighting is applied (keywords, strings, comments colored)
4. Verify: LSP server starts (check status bar widget)
5. Verify: Type `Butt` and trigger completion (Ctrl+Space) - should suggest `Button`
6. Verify: Hover over `Button` - should show documentation
7. Verify: Ctrl+Click on `Button` - should jump to definition
8. Verify: Introduce syntax error (e.g., remove semicolon) - should show red underline
9. Verify: Format code (Ctrl+Alt+L) - should format the file
**Step 5: Document test results**
Create a file documenting what works:
```bash
cat > test-files/TEST_RESULTS.md << 'EOF'
# Slint LSP Integration Test Results
Date: 2026-01-29
## Test Environment
- IntelliJ IDEA: 2025.2.4
- Slint LSP Version: 1.14.1
- Plugin Version: 1.0-SNAPSHOT
## Test Results
### File Type Recognition
- [ ] .slint files show Slint icon
- [ ] File type is recognized as "Slint"
### Syntax Highlighting
- [ ] Keywords highlighted (import, export, component, inherits)
- [ ] Strings highlighted
- [ ] Comments highlighted
- [ ] Properties highlighted
### LSP Features
- [ ] LSP server starts automatically
- [ ] Code completion works
- [ ] Hover documentation works
- [ ] Goto definition works
- [ ] Diagnostics show errors/warnings
- [ ] Code formatting works
- [ ] Find references works
- [ ] Rename refactoring works
## Issues Found
(Document any issues here)
## Notes
(Any additional observations)
EOF
```
**Step 6: Commit test files**
```bash
git add test-files/
git commit -m "test: add sample Slint file and test results template"
```
---
## Task 9: Update CLAUDE.md Documentation
**Files:**
- Modify: `CLAUDE.md`
**Step 1: Add testing section to CLAUDE.md**
Add this section before "## Development Notes":
```markdown
## Testing the Plugin
### Manual Testing
1. **Build and run in sandbox:**
```bash
./gradlew runIde
```
2. **Test with sample file:**
- Open `test-files/hello.slint`
- Verify file icon, syntax highlighting, and LSP features
3. **Test LSP features:**
- Code completion: Type and press Ctrl+Space
- Goto definition: Ctrl+Click on symbols
- Hover: Mouse over symbols
- Diagnostics: Introduce syntax errors
- Formatting: Ctrl+Alt+L
### Verify LSP Server
Check LSP server status in the status bar (bottom right). Should show "Slint" when a .slint file is open.
### Common Issues
- **LSP server not starting**: Check that LSP binary exists in sandbox at `sandbox/plugins/slint/lsp/slint-lsp-{platform}`
- **No syntax highlighting**: Verify TextMate grammar file is in resources
- **No completion**: Check LSP server logs in `idea.log`
```
**Step 2: Commit documentation update**
```bash
git add CLAUDE.md
git commit -m "docs: add testing instructions to CLAUDE.md"
```
---
## Task 10: Final Verification and Cleanup
**Step 1: Run all verification tasks**
Run:
```bash
./gradlew clean build verifyPlugin
```
Expected: All tasks complete successfully
**Step 2: Check plugin structure**
Run: `./gradlew buildPlugin && unzip -l build/distributions/slint-1.0-SNAPSHOT.zip | grep -E "(slint-lsp|\.slint\.tmLanguage)"`
Expected: Should see LSP binaries and TextMate grammar in the plugin ZIP
**Step 3: Review all changes**
Run: `git log --oneline --graph`
Expected: Should see all commits from this implementation
**Step 4: Create final summary commit**
```bash
git add -A
git commit -m "feat: complete Slint LSP integration with file type, syntax highlighting, and LSP features
- Added SlintLanguage and SlintFileType definitions
- Registered .slint file type with IntelliJ
- Integrated Slint LSP server with type-safe file detection
- Added TextMate-based syntax highlighting
- Included test files and documentation
- All standard LSP features now available: completion, diagnostics, goto definition, hover, formatting, references, rename"
```
---
## Success Criteria
✅ .slint files recognized by IntelliJ with proper icon
✅ Syntax highlighting works using TextMate grammar
✅ LSP server starts automatically when .slint file opened
✅ Code completion provides suggestions
✅ Diagnostics show errors and warnings
✅ Goto definition navigates correctly
✅ Hover shows documentation
✅ Code formatting works
✅ Find references works
✅ Rename refactoring works
✅ Plugin builds and runs in sandbox IDE
✅ All changes committed with clear messages
## Next Steps (Phase 2)
- Implement live preview integration (Slint-specific feature)
- Add project configuration UI
- Optimize LSP server startup time
- Add more comprehensive tests

0
gradlew vendored Normal file → Executable file
View File

View File

@@ -0,0 +1,5 @@
<application>
<component name="UpdatesConfigurable">
<option name="CHECK_NEEDED" value="false" />
</component>
</application>

Binary file not shown.

View File

@@ -0,0 +1,248 @@
ByteCodeViewer|Other Tools
JBoss|Deployment
JSIntentionPowerPack|JavaScript Frameworks and Tools
JUnit|Test Tools
JavaScriptDebugger|JavaScript Frameworks and Tools
JavaScript|JavaScript Frameworks and Tools
Karma|JavaScript Frameworks and Tools
Lombook Plugin|JVM Frameworks
NodeJS|JavaScript Frameworks and Tools
Refactor-X|HTML and XML
Remote Development Server|null
TestNG-J|Test Tools
Tomcat|Deployment
com.deadlock.scsyntax|JavaScript Frameworks and Tools
com.intellij.LineProfiler|null
com.intellij.analysis.pwa.java|null
com.intellij.analysis.pwa|null
com.intellij.aop|JVM Frameworks
com.intellij.beanValidation|JVM Frameworks
com.intellij.cdi|JVM Frameworks
com.intellij.completion.ml.ranking|Local AI/ML Tools
com.intellij.configurationScript|null
com.intellij.copyright|Other Tools
com.intellij.css|Style Sheets
com.intellij.database|Database
com.intellij.dev|null
com.intellij.diagram|Other Tools
com.intellij.dsm|Other Tools
com.intellij.freemarker|Template Languages
com.intellij.grpc|Microservices
com.intellij.hibernate|JVM Frameworks
com.intellij.java-i18n|Other Tools
com.intellij.java.ide|null
com.intellij.javaee.app.servers.integration|Deployment
com.intellij.javaee.el|JVM Frameworks
com.intellij.javaee.extensions|JVM Frameworks
com.intellij.javaee.jpa|JVM Frameworks
com.intellij.javaee.web|JVM Frameworks
com.intellij.javaee|JVM Frameworks
com.intellij.java|null
com.intellij.jsonpath|JavaScript Frameworks and Tools
com.intellij.jsp|Template Languages
com.intellij.llmInstaller|Other Tools
com.intellij.micronaut|JVM Frameworks
com.intellij.microservices.jvm|JVM Frameworks
com.intellij.microservices.ui|Microservices
com.intellij.openRewrite|JVM Frameworks
com.intellij.persistence|JVM Frameworks
com.intellij.platform.ide.provisioner|null
com.intellij.platform.images|null
com.intellij.plugins.webcomponents|JavaScript Frameworks and Tools
com.intellij.properties|Languages
com.intellij.quarkus|JVM Frameworks
com.intellij.reactivestreams|JVM Frameworks
com.intellij.react|JavaScript Frameworks and Tools
com.intellij.searcheverywhere.ml|Local AI/ML Tools
com.intellij.spring.boot.initializr|JVM Frameworks
com.intellij.spring.boot|JVM Frameworks
com.intellij.spring.cloud|JVM Frameworks
com.intellij.spring.data|JVM Frameworks
com.intellij.spring.integration|JVM Frameworks
com.intellij.spring.messaging|JVM Frameworks
com.intellij.spring.mvc|JVM Frameworks
com.intellij.spring.security|JVM Frameworks
com.intellij.spring|JVM Frameworks
com.intellij.stylelint|JavaScript Frameworks and Tools
com.intellij.swagger|Microservices
com.intellij.tailwindcss|Style Sheets
com.intellij.tasks.timeTracking|Other Tools
com.intellij.tasks|Other Tools
com.intellij.thymeleaf|Template Languages
com.intellij.tracing.ide|null
com.intellij.turboComplete|Local AI/ML Tools
com.intellij.velocity|Template Languages
com.intellij|null
com.jetbrains.performancePlugin.async|Other Tools
com.jetbrains.performancePlugin.dynamicPlugins|null
com.jetbrains.performancePlugin|Other Tools
com.jetbrains.plugins.webDeployment|Deployment
com.jetbrains.restClient|Microservices
com.jetbrains.restWebServices|JVM Frameworks
com.jetbrains.sh|Languages
com.jetbrains.warmup.performanceTesting|null
idea.plugin.protoeditor|Microservices
intellij.caches.shared|null
intellij.charts|null
intellij.grid.core.impl|null
intellij.grid.impl|null
intellij.indexing.shared.core|null
intellij.indexing.shared|null
intellij.nextjs|JavaScript Frameworks and Tools
intellij.platform.ijent.impl|Deployment
intellij.prettierJS|JavaScript Frameworks and Tools
intellij.vitejs|JavaScript Frameworks and Tools
intellij.webpack|JavaScript Frameworks and Tools
intellij.webp|null
org.editorconfig.editorconfigjetbrains|Other Tools
org.intellij.groovy|Languages
org.intellij.intelliLang|Other Tools
org.intellij.plugins.markdown|Languages
org.intellij.plugins.postcss|Style Sheets
org.jetbrains.completion.full.line|Local AI/ML Tools
org.jetbrains.debugger.streams|Other Tools
org.jetbrains.idea.eclipse|Other Tools
org.jetbrains.idea.maven.ext|Build Tools
org.jetbrains.idea.maven.model|null
org.jetbrains.idea.maven.server.api|null
org.jetbrains.idea.maven|Build Tools
org.jetbrains.idea.reposearch|null
org.jetbrains.java.decompiler|Other Tools
org.jetbrains.kotlin|Languages
org.jetbrains.plugins.less|Style Sheets
org.jetbrains.plugins.node-remote-interpreter|JavaScript Frameworks and Tools
org.jetbrains.plugins.remote-run|null
org.jetbrains.plugins.sass|Style Sheets
org.jetbrains.plugins.terminal|Other Tools
org.jetbrains.plugins.textmate|Other Tools
org.jetbrains.plugins.vue|JavaScript Frameworks and Tools
org.jetbrains.plugins.wsl.remoteSdk|null
org.jetbrains.plugins.yaml|Languages
org.jetbrains.security.package-checker|null
org.toml.lang|Languages
tanvd.grazi|null
tslint|JavaScript Frameworks and Tools

View File

@@ -0,0 +1 @@
<code_scheme name="Default" version="173" />

View File

@@ -0,0 +1,33 @@
AngularJS
AntSupport
Coverage
Docker
Git4Idea
HtmlTools
PerforceDirectPlugin
Subversion
XPathView
com.android.tools.design
com.intellij.flyway
com.intellij.gradle
com.intellij.javaee.reverseEngineering
com.intellij.kubernetes
com.intellij.liquibase
com.intellij.plugins.eclipsekeymap
com.intellij.plugins.netbeanskeymap
com.intellij.plugins.visualstudiokeymap
com.intellij.settingsSync
com.intellij.uiDesigner
com.jetbrains.codeWithMe
com.jetbrains.gateway
com.jetbrains.space
hg4idea
intellij.ktor
org.intellij.qodana
org.jetbrains.android
org.jetbrains.idea.gradle.ext
org.jetbrains.plugins.docker.gateway
org.jetbrains.plugins.github
org.jetbrains.plugins.gitlab
org.jetbrains.plugins.javaFX
training

View File

@@ -0,0 +1,4 @@
ide.experimental.ui
true
idea.plugins.compatible.build

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,348 @@
{
"groups" : [ {
"id" : "mlse.event.log",
"builds" : [ ],
"versions" : [ {
"from" : "1"
} ],
"rules" : {
"event_id" : [ "{enum#__event_id}" ],
"event_data" : {
"code" : [ "{regexp#integer}" ],
"error" : [ "{util#class_name}", "{enum:EMPTY_CONTENT|INVALID_JSON|UNKNOWN}", "{enum:EMPTY_SERVICE_URL|UNREACHABLE_SERVICE|EMPTY_RESPONSE_BODY|ERROR_ON_LOAD}" ],
"error_ts" : [ "{regexp#integer}" ],
"errors" : [ "{regexp#integer}" ],
"external" : [ "{enum#boolean}" ],
"failed" : [ "{regexp#integer}" ],
"paths" : [ "{regexp#hash}" ],
"send" : [ "{regexp#integer}" ],
"stage" : [ "{enum:LOADING|PARSING}" ],
"succeed" : [ "{regexp#integer}" ],
"total" : [ "{regexp#integer}" ],
"version" : [ "{regexp#version}" ]
},
"enums" : {
"__event_id" : [ "logs.send", "loading.config.failed", "metadata.loaded", "metadata.updated", "metadata.update.failed", "metadata.load.failed" ]
}
},
"anonymized_fields" : [ {
"event" : "logs.send",
"fields" : [ "paths" ]
} ]
}, {
"id" : "mlse.log",
"builds" : [ ],
"versions" : [ {
"from" : "2"
} ],
"rules" : {
"event_id" : [ "{enum:sessionFinished|searchRestarted|key.not.computed}" ],
"event_data" : {
"closePopup" : [ "{enum#boolean}" ],
"collectedItems.absentFeatures" : [ "{util#mlse_element_feature}" ],
"collectedItems.actionId" : [ "{util#action}", "{enum#action}" ],
"collectedItems.contributor.contributorId" : [ "{enum:SearchEverywhereContributor.All|ClassSearchEverywhereContributor|FileSearchEverywhereContributor|RecentFilesSEContributor|SymbolSearchEverywhereContributor|ActionSearchEverywhereContributor|RunConfigurationsSEContributor|CommandsContributor|TopHitSEContributor|com.intellij.ide.actions.searcheverywhere.CalculatorSEContributor|TmsSearchEverywhereContributor|YAMLKeysSearchEverywhereContributor|UrlSearchEverywhereContributor|Vcs.Git|AutocompletionContributor|TextSearchContributor|DbSETablesContributor|third.party}", "{enum:SearchEverywhereSpellingCorrectorContributor}", "{enum:SemanticActionSearchEverywhereContributor}" ],
"collectedItems.contributor.contributorIsMostPopular" : [ "{enum#boolean}" ],
"collectedItems.contributor.contributorPopularityIndex" : [ "{regexp#integer}" ],
"collectedItems.contributor.contributorPriority" : [ "{regexp#integer}" ],
"collectedItems.contributor.contributorWeight" : [ "{regexp#integer}" ],
"collectedItems.contributorId" : [ "{enum#se_tab}" ],
"collectedItems.features.actionSimilarityScore" : [ "{regexp#float}" ],
"collectedItems.features.allInitialLettersMatch" : [ "{enum#boolean}" ],
"collectedItems.features.asActionPureSemantic" : [ "{enum#boolean}" ],
"collectedItems.features.authoritiesSize" : [ "{regexp#integer}" ],
"collectedItems.features.directoryDepth" : [ "{regexp#integer}" ],
"collectedItems.features.fileGroup" : [ "{enum:MAIN|BUILD|CHANGELOG|CONFIG|README}" ],
"collectedItems.features.fileStatus" : [ "{enum#vcs_file_status}" ],
"collectedItems.features.fileType" : [ "{util#file_type}" ],
"collectedItems.features.fileTypeMatchesQuery" : [ "{enum#boolean}" ],
"collectedItems.features.fileTypeUsageRatio" : [ "{regexp#float}" ],
"collectedItems.features.fileTypeUsageRatioToMax" : [ "{regexp#float}" ],
"collectedItems.features.fileTypeUsageRatioToMin" : [ "{regexp#float}" ],
"collectedItems.features.fileTypeUsedInLastDay" : [ "{enum#boolean}" ],
"collectedItems.features.fileTypeUsedInLastHour" : [ "{enum#boolean}" ],
"collectedItems.features.fileTypeUsedInLastMinute" : [ "{enum#boolean}" ],
"collectedItems.features.fileTypeUsedInLastMonth" : [ "{enum#boolean}" ],
"collectedItems.features.fromConfigurable" : [ "{enum#boolean}" ],
"collectedItems.features.globalUsage" : [ "{regexp#integer}" ],
"collectedItems.features.globalUsageToMax" : [ "{regexp#float}" ],
"collectedItems.features.globalUsageToMaxV1" : [ "{regexp#float}" ],
"collectedItems.features.globalUsageToMaxV2" : [ "{regexp#float}" ],
"collectedItems.features.globalUsageToMaxV3" : [ "{regexp#float}" ],
"collectedItems.features.globalUsageToMaxV4" : [ "{regexp#float}" ],
"collectedItems.features.globalUsageV1" : [ "{regexp#integer}" ],
"collectedItems.features.globalUsageV2" : [ "{regexp#integer}" ],
"collectedItems.features.globalUsageV3" : [ "{regexp#integer}" ],
"collectedItems.features.globalUsageV4" : [ "{regexp#integer}" ],
"collectedItems.features.groupLength" : [ "{regexp#integer}" ],
"collectedItems.features.heuristicPriority" : [ "{regexp#integer}" ],
"collectedItems.features.isAbbreviation" : [ "{enum#boolean}" ],
"collectedItems.features.isAccessibleFromModule" : [ "{enum#boolean}" ],
"collectedItems.features.isAction" : [ "{enum#boolean}" ],
"collectedItems.features.isActionPureSemantic" : [ "{enum#boolean}" ],
"collectedItems.features.isBookmark" : [ "{enum#boolean}" ],
"collectedItems.features.isBooleanOption" : [ "{enum#boolean}" ],
"collectedItems.features.isChanged" : [ "{enum#boolean}" ],
"collectedItems.features.isDeprecated" : [ "{enum#boolean}" ],
"collectedItems.features.isDirectory" : [ "{enum#boolean}" ],
"collectedItems.features.isEditorAction" : [ "{enum#boolean}" ],
"collectedItems.features.isEnabled" : [ "{enum#boolean}" ],
"collectedItems.features.isExactMatch" : [ "{enum#boolean}" ],
"collectedItems.features.isExactRelativePath" : [ "{enum#boolean}" ],
"collectedItems.features.isFavorite" : [ "{enum#boolean}" ],
"collectedItems.features.isFromLibrary" : [ "{enum#boolean}" ],
"collectedItems.features.isGroup" : [ "{enum#boolean}" ],
"collectedItems.features.isHighPriority" : [ "{enum#boolean}" ],
"collectedItems.features.isIgnored" : [ "{enum#boolean}" ],
"collectedItems.features.isInComment" : [ "{enum#boolean}" ],
"collectedItems.features.isInExcluded" : [ "{enum#boolean}" ],
"collectedItems.features.isInSource" : [ "{enum#boolean}" ],
"collectedItems.features.isInTestSources" : [ "{enum#boolean}" ],
"collectedItems.features.isInvalid" : [ "{enum#boolean}" ],
"collectedItems.features.isNotDefault" : [ "{enum#boolean}" ],
"collectedItems.features.isOpened" : [ "{enum#boolean}" ],
"collectedItems.features.isOption" : [ "{enum#boolean}" ],
"collectedItems.features.isPureSemantic" : [ "{enum#boolean}" ],
"collectedItems.features.isRegistryOption" : [ "{enum#boolean}" ],
"collectedItems.features.isSameFileTypeAsOpenedFile" : [ "{enum#boolean}" ],
"collectedItems.features.isSameModule" : [ "{enum#boolean}" ],
"collectedItems.features.isSearchAction" : [ "{enum#boolean}" ],
"collectedItems.features.isSemanticOnly" : [ "{enum#boolean}" ],
"collectedItems.features.isShared" : [ "{enum#boolean}" ],
"collectedItems.features.isTemporary" : [ "{enum#boolean}" ],
"collectedItems.features.isToggleAction" : [ "{enum#boolean}" ],
"collectedItems.features.isTopLevel" : [ "{enum#boolean}" ],
"collectedItems.features.javaIsAbstract" : [ "{enum#boolean}" ],
"collectedItems.features.javaIsInner" : [ "{enum#boolean}" ],
"collectedItems.features.javaIsInstantiatable" : [ "{enum#boolean}" ],
"collectedItems.features.javaIsInterface" : [ "{enum#boolean}" ],
"collectedItems.features.javaIsLocalOrAnonymous" : [ "{enum#boolean}" ],
"collectedItems.features.javaIsPrivate" : [ "{enum#boolean}" ],
"collectedItems.features.javaIsProtected" : [ "{enum#boolean}" ],
"collectedItems.features.javaIsPublic" : [ "{enum#boolean}" ],
"collectedItems.features.javaIsStatic" : [ "{enum#boolean}" ],
"collectedItems.features.javaNumberOfAllFields" : [ "{regexp#integer}" ],
"collectedItems.features.javaNumberOfAllMethods" : [ "{regexp#integer}" ],
"collectedItems.features.javaNumberOfAnnotations" : [ "{regexp#integer}" ],
"collectedItems.features.javaNumberOfDeprecatedFields" : [ "{regexp#integer}" ],
"collectedItems.features.javaNumberOfDeprecatedMethods" : [ "{regexp#integer}" ],
"collectedItems.features.javaNumberOfFields" : [ "{regexp#integer}" ],
"collectedItems.features.javaNumberOfMethods" : [ "{regexp#integer}" ],
"collectedItems.features.javaNumberOfSupers" : [ "{regexp#integer}" ],
"collectedItems.features.keyIsInTop5RecentlyUsed" : [ "{enum#boolean}" ],
"collectedItems.features.keyIsMostPopular" : [ "{enum#boolean}" ],
"collectedItems.features.keyIsMostRecentlyUsed" : [ "{enum#boolean}" ],
"collectedItems.features.keyNeverUsed" : [ "{enum#boolean}" ],
"collectedItems.features.kotlinIsAbstract" : [ "{enum#boolean}" ],
"collectedItems.features.kotlinIsData" : [ "{enum#boolean}" ],
"collectedItems.features.kotlinIsDocumented" : [ "{enum#boolean}" ],
"collectedItems.features.kotlinIsEnum" : [ "{enum#boolean}" ],
"collectedItems.features.kotlinIsInline" : [ "{enum#boolean}" ],
"collectedItems.features.kotlinIsInner" : [ "{enum#boolean}" ],
"collectedItems.features.kotlinIsInterface" : [ "{enum#boolean}" ],
"collectedItems.features.kotlinIsInternal" : [ "{enum#boolean}" ],
"collectedItems.features.kotlinIsLocalOrAnon" : [ "{enum#boolean}" ],
"collectedItems.features.kotlinIsObject" : [ "{enum#boolean}" ],
"collectedItems.features.kotlinIsOpen" : [ "{enum#boolean}" ],
"collectedItems.features.kotlinIsPrivate" : [ "{enum#boolean}" ],
"collectedItems.features.kotlinIsProtected" : [ "{enum#boolean}" ],
"collectedItems.features.kotlinIsPublic" : [ "{enum#boolean}" ],
"collectedItems.features.kotlinIsSAM" : [ "{enum#boolean}" ],
"collectedItems.features.kotlinIsSealed" : [ "{enum#boolean}" ],
"collectedItems.features.kotlinIsValue" : [ "{enum#boolean}" ],
"collectedItems.features.kotlinNumberOfDeclarations" : [ "{regexp#integer}" ],
"collectedItems.features.kotlinNumberOfDocs" : [ "{regexp#integer}" ],
"collectedItems.features.kotlinNumberOfMethods" : [ "{regexp#integer}" ],
"collectedItems.features.kotlinNumberOfOverridden" : [ "{regexp#integer}" ],
"collectedItems.features.kotlinNumberOfProperties" : [ "{regexp#integer}" ],
"collectedItems.features.kotlinNumberOfReceivers" : [ "{regexp#integer}" ],
"collectedItems.features.kotlinNumberOfSupers" : [ "{regexp#integer}" ],
"collectedItems.features.langIsInTop3MostUsed" : [ "{enum#boolean}" ],
"collectedItems.features.langIsMostUsed" : [ "{enum#boolean}" ],
"collectedItems.features.langNeverUsed" : [ "{enum#boolean}" ],
"collectedItems.features.langSameAsOpenedFile" : [ "{enum#boolean}" ],
"collectedItems.features.langUseCount" : [ "{regexp#integer}" ],
"collectedItems.features.langUsedInLastDay" : [ "{enum#boolean}" ],
"collectedItems.features.langUsedInLastMonth" : [ "{enum#boolean}" ],
"collectedItems.features.langUsedInLastWeek" : [ "{enum#boolean}" ],
"collectedItems.features.language" : [ "{util#lang}" ],
"collectedItems.features.matchMode" : [ "{enum:NONE|INTENTION|NAME|DESCRIPTION|GROUP|NON_MENU|SYNONYM}" ],
"collectedItems.features.mlScore" : [ "{regexp#float}" ],
"collectedItems.features.nameLength" : [ "{regexp#integer}" ],
"collectedItems.features.packageDistance" : [ "{regexp#integer}" ],
"collectedItems.features.packageDistanceNorm" : [ "{regexp#float}" ],
"collectedItems.features.parentStatIsMostPopular" : [ "{enum#boolean}" ],
"collectedItems.features.parentStatIsMostRecent" : [ "{enum#boolean}" ],
"collectedItems.features.parentStatRecency" : [ "{regexp#integer}" ],
"collectedItems.features.parentStatUseCount" : [ "{regexp#integer}" ],
"collectedItems.features.pluginId" : [ "{util#plugin}" ],
"collectedItems.features.pluginType" : [ "{enum#plugin_type}" ],
"collectedItems.features.predictionScore" : [ "{regexp#float}" ],
"collectedItems.features.prefixExact" : [ "{enum#boolean}" ],
"collectedItems.features.prefixGreedyScore" : [ "{regexp#float}" ],
"collectedItems.features.prefixGreedyWithCaseScore" : [ "{regexp#float}" ],
"collectedItems.features.prefixMatchedLastWord" : [ "{enum#boolean}" ],
"collectedItems.features.prefixMatchedWordsRelative" : [ "{regexp#float}" ],
"collectedItems.features.prefixMatchedWordsScore" : [ "{regexp#float}" ],
"collectedItems.features.prefixMatchedWordsWithCaseRelative" : [ "{regexp#float}" ],
"collectedItems.features.prefixMatchedWordsWithCaseScore" : [ "{regexp#float}" ],
"collectedItems.features.prefixMatchingType" : [ "{enum#query_matching_type}" ],
"collectedItems.features.prefixSameStartCount" : [ "{regexp#integer}" ],
"collectedItems.features.prefixSkippedWords" : [ "{regexp#integer}" ],
"collectedItems.features.priority" : [ "{regexp#integer}" ],
"collectedItems.features.recentFilesIndex" : [ "{regexp#integer}" ],
"collectedItems.features.relPathPrefixGreedyScore" : [ "{regexp#float}" ],
"collectedItems.features.relPathPrefixMatchedWordsRelative" : [ "{regexp#float}" ],
"collectedItems.features.relPathPrefixMatchedWordsScore" : [ "{regexp#float}" ],
"collectedItems.features.relPathPrefixSameStartCount" : [ "{regexp#integer}" ],
"collectedItems.features.runConfigType" : [ "{util#run_config_type}" ],
"collectedItems.features.schemes" : [ "{enum:http|https|ws|wss}" ],
"collectedItems.features.segmentsTotal" : [ "{regexp#integer}" ],
"collectedItems.features.similarityScore" : [ "{regexp#float}" ],
"collectedItems.features.statIsMostPopular" : [ "{enum#boolean}" ],
"collectedItems.features.statIsMostRecent" : [ "{enum#boolean}" ],
"collectedItems.features.statRecency" : [ "{regexp#integer}" ],
"collectedItems.features.statUseCount" : [ "{regexp#integer}" ],
"collectedItems.features.suggestionConfidence" : [ "{regexp#float}" ],
"collectedItems.features.textLength" : [ "{regexp#integer}" ],
"collectedItems.features.timeSinceLastFileTypeUsage" : [ "{regexp#integer}" ],
"collectedItems.features.timeSinceLastModification" : [ "{regexp#integer}" ],
"collectedItems.features.timeSinceLastUsage" : [ "{regexp#integer}" ],
"collectedItems.features.timeSinceLastUsageSe" : [ "{regexp#integer}" ],
"collectedItems.features.totalSymbolsAmount" : [ "{regexp#integer}" ],
"collectedItems.features.type" : [ "{enum:ABBREVIATION|INTENTION|TOP_HIT|OPTION|ACTION}", "{enum:SEMANTIC}" ],
"collectedItems.features.typeWeight" : [ "{regexp#integer}" ],
"collectedItems.features.usage" : [ "{regexp#integer}" ],
"collectedItems.features.usageSe" : [ "{regexp#integer}" ],
"collectedItems.features.usageToMax" : [ "{regexp#float}" ],
"collectedItems.features.usageToMaxSe" : [ "{regexp#float}" ],
"collectedItems.features.usagesPerUserRatio" : [ "{regexp#float}" ],
"collectedItems.features.usagesPerUserRatioV1" : [ "{regexp#float}" ],
"collectedItems.features.usagesPerUserRatioV2" : [ "{regexp#float}" ],
"collectedItems.features.usagesPerUserRatioV3" : [ "{regexp#float}" ],
"collectedItems.features.usagesPerUserRatioV4" : [ "{regexp#float}" ],
"collectedItems.features.usersRatio" : [ "{regexp#float}" ],
"collectedItems.features.usersRatioV1" : [ "{regexp#float}" ],
"collectedItems.features.usersRatioV2" : [ "{regexp#float}" ],
"collectedItems.features.usersRatioV3" : [ "{regexp#float}" ],
"collectedItems.features.usersRatioV4" : [ "{regexp#float}" ],
"collectedItems.features.variablesTotal" : [ "{regexp#integer}" ],
"collectedItems.features.wasModifiedInLastDay" : [ "{enum#boolean}" ],
"collectedItems.features.wasModifiedInLastHour" : [ "{enum#boolean}" ],
"collectedItems.features.wasModifiedInLastMinute" : [ "{enum#boolean}" ],
"collectedItems.features.wasModifiedInLastMonth" : [ "{enum#boolean}" ],
"collectedItems.features.wasUsedInLastDay" : [ "{enum#boolean}" ],
"collectedItems.features.wasUsedInLastDaySe" : [ "{enum#boolean}" ],
"collectedItems.features.wasUsedInLastHour" : [ "{enum#boolean}" ],
"collectedItems.features.wasUsedInLastHourSe" : [ "{enum#boolean}" ],
"collectedItems.features.wasUsedInLastMinute" : [ "{enum#boolean}" ],
"collectedItems.features.wasUsedInLastMinuteSe" : [ "{enum#boolean}" ],
"collectedItems.features.wasUsedInLastMonth" : [ "{enum#boolean}" ],
"collectedItems.features.wasUsedInLastMonthSe" : [ "{enum#boolean}" ],
"collectedItems.features.weight" : [ "{regexp#float}" ],
"collectedItems.features.withIcon" : [ "{enum#boolean}" ],
"collectedItems.features.yamlFileModifiedInLastDay" : [ "{enum#boolean}" ],
"collectedItems.features.yamlFileModifiedInLastHour" : [ "{enum#boolean}" ],
"collectedItems.features.yamlFileModifiedInLastMonth" : [ "{enum#boolean}" ],
"collectedItems.features.yamlFileModifiedInLastWeek" : [ "{enum#boolean}" ],
"collectedItems.features.yamlFileRecencyIndex" : [ "{regexp#integer}" ],
"collectedItems.features.yamlKeyIsInTop5RecentlyUsed" : [ "{enum#boolean}" ],
"collectedItems.features.yamlKeyIsMostPopular" : [ "{enum#boolean}" ],
"collectedItems.features.yamlKeyIsMostRecentlyUsed" : [ "{enum#boolean}" ],
"collectedItems.features.yamlKeyNeverUsed" : [ "{enum#boolean}" ],
"collectedItems.features.yamlTimeSinceLastModification" : [ "{regexp#integer}" ],
"collectedItems.id" : [ "{regexp#integer}" ],
"collectedItems.mlWeight" : [ "{regexp#float}" ],
"collectedItems.priority" : [ "{regexp#integer}" ],
"contributors.id" : [ "{enum:SearchEverywhereContributor.All|ClassSearchEverywhereContributor|FileSearchEverywhereContributor|RecentFilesSEContributor|SymbolSearchEverywhereContributor|ActionSearchEverywhereContributor|RunConfigurationsSEContributor|CommandsContributor|TopHitSEContributor|com.intellij.ide.actions.searcheverywhere.CalculatorSEContributor|TmsSearchEverywhereContributor|YAMLKeysSearchEverywhereContributor|UrlSearchEverywhereContributor|Vcs.Git|AutocompletionContributor|TextSearchContributor|DbSETablesContributor|third.party}" ],
"contributors.isMostPopular" : [ "{enum#boolean}" ],
"contributors.popularityIndex" : [ "{regexp#integer}" ],
"contributors.priority" : [ "{regexp#integer}" ],
"contributors.weight" : [ "{regexp#integer}" ],
"experimentGroup" : [ "{regexp#integer}" ],
"experimentVersion" : [ "{regexp#integer}" ],
"globalMaxUsage" : [ "{regexp#integer}" ],
"globalMaxUsageV1" : [ "{regexp#integer}" ],
"globalMaxUsageV2" : [ "{regexp#integer}" ],
"globalMaxUsageV3" : [ "{regexp#integer}" ],
"globalMaxUsageV4" : [ "{regexp#integer}" ],
"globalMinUsage" : [ "{regexp#integer}" ],
"globalMinUsageV1" : [ "{regexp#integer}" ],
"globalMinUsageV2" : [ "{regexp#integer}" ],
"globalMinUsageV3" : [ "{regexp#integer}" ],
"globalMinUsageV4" : [ "{regexp#integer}" ],
"isConsistent" : [ "{enum#boolean}" ],
"isForceExperiment" : [ "{enum#boolean}" ],
"isInternal" : [ "{enum#boolean}" ],
"isMixedList" : [ "{enum#boolean}" ],
"isSingleModuleProject" : [ "{enum#boolean}" ],
"lastOpenToolWindow" : [ "{util#toolwindow}" ],
"logFeatures" : [ "{enum#boolean}" ],
"maxUsage" : [ "{regexp#integer}" ],
"maxUsageSE" : [ "{regexp#integer}" ],
"minUsage" : [ "{regexp#integer}" ],
"minUsageSE" : [ "{regexp#integer}" ],
"numberOfOpenEditors" : [ "{regexp#integer}" ],
"openFileTypes" : [ "{util#file_type}" ],
"orderByMl" : [ "{enum#boolean}" ],
"plugin" : [ "{util#plugin}" ],
"plugin_type" : [ "{util#plugin_type}" ],
"plugin_version" : [ "{util#plugin_version}" ],
"projectDisposed" : [ "{enum#boolean}" ],
"projectOpened" : [ "{enum#boolean}" ],
"rebuildReason" : [ "{enum#restart_reasons}" ],
"seTabId" : [ "{enum#se_tab}", "{enum:SearchEverywhereSpellingCorrectorContributor}", "{enum:Git}" ],
"searchIndex" : [ "{regexp#integer}" ],
"searchStateFeatures.isCaseSensitive" : [ "{enum#boolean}" ],
"searchStateFeatures.isDumbMode" : [ "{enum#boolean}" ],
"searchStateFeatures.isEmptyQuery" : [ "{enum#boolean}" ],
"searchStateFeatures.isRegularExpressions" : [ "{enum#boolean}" ],
"searchStateFeatures.isSearchEverywhere" : [ "{enum#boolean}" ],
"searchStateFeatures.isWholeWordsOnly" : [ "{enum#boolean}" ],
"searchStateFeatures.queryContainsAbbreviations" : [ "{enum#boolean}" ],
"searchStateFeatures.queryContainsCommandChar" : [ "{enum#boolean}" ],
"searchStateFeatures.queryContainsPath" : [ "{enum#boolean}" ],
"searchStateFeatures.queryContainsSpaces" : [ "{enum#boolean}" ],
"searchStateFeatures.queryIsAllUppercase" : [ "{enum#boolean}" ],
"searchStateFeatures.queryIsCamelCase" : [ "{enum#boolean}" ],
"searchStateFeatures.queryLength" : [ "{regexp#integer}" ],
"searchStateFeatures.searchScope" : [ "{util#scopeRule}" ],
"selectedIds" : [ "{regexp#integer}" ],
"selectedIndexes" : [ "{regexp#integer}" ],
"semanticExperimentGroup" : [ "{regexp#integer}" ],
"semanticSearchEnabled" : [ "{enum#boolean}" ],
"sessionId" : [ "{regexp#integer}" ],
"startTime" : [ "{regexp#integer}" ],
"timeToFirstResult" : [ "{regexp#integer}" ],
"totalItems" : [ "{regexp#integer}" ],
"typedBackspaces" : [ "{regexp#integer}" ],
"typedSymbolKeys" : [ "{regexp#integer}" ],
"unsupported_classes" : [ "{util#class_name}" ]
},
"enums" : {
"query_matching_type" : [ "START_WITH", "WORDS_FIRST_CHAR", "GREEDY_WITH_CASE", "GREEDY", "UNKNOWN" ],
"restart_reasons" : [ "SEARCH_STARTED", "TEXT_CHANGED", "TAB_CHANGED", "SCOPE_CHANGED", "EXIT_DUMB_MODE", "TEXT_SEARCH_OPTION_CHANGED" ],
"se_tab" : [ "SearchEverywhereContributor.All", "ClassSearchEverywhereContributor", "FileSearchEverywhereContributor", "RecentFilesSEContributor", "SymbolSearchEverywhereContributor", "ActionSearchEverywhereContributor", "RunConfigurationsSEContributor", "CommandsContributor", "TopHitSEContributor", "com.intellij.ide.actions.searcheverywhere.CalculatorSEContributor", "TmsSearchEverywhereContributor", "YAMLKeysSearchEverywhereContributor", "UrlSearchEverywhereContributor", "Vcs.Git", "AutocompletionContributor", "TextSearchContributor", "DbSETablesContributor", "third.party" ],
"vcs_file_status" : [ "NOT_CHANGED", "NOT_CHANGED_IMMEDIATE", "NOT_CHANGED_RECURSIVE", "DELETED", "MODIFIED", "ADDED", "MERGED", "UNKNOWN", "IDEA_FILESTATUS_IGNORED", "HIJACKED", "IDEA_FILESTATUS_MERGED_WITH_CONFLICTS", "IDEA_FILESTATUS_MERGED_WITH_BOTH_CONFLICTS", "IDEA_FILESTATUS_MERGED_WITH_PROPERTY_CONFLICTS", "IDEA_FILESTATUS_DELETED_FROM_FILE_SYSTEM", "SWITCHED", "OBSOLETE", "SUPPRESSED" ]
}
}
} ],
"rules" : {
"enums" : {
"action" : [ "git4idea.rebase.retry", "git4idea.rebase.continue", "git4idea.rebase.abort", "git4idea.rebase.resolve" ],
"boolean" : [ "true", "false", "TRUE", "FALSE", "True", "False" ],
"plugin_type" : [ "JVM_CORE", "PLATFORM", "JB_BUNDLED", "JB_NOT_BUNDLED", "LISTED", "NOT_LISTED", "JB_UPDATED_BUNDLED", "UNKNOWN", "FROM_SOURCES" ]
},
"regexps" : {
"count" : "\\d+K?M?\\+?",
"date_YYYY-MM-DD_HH" : "^[12][0-9]{3}-(0[0-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])( ([0-1][0-9]|2[0-3]))?$",
"date_short_hash" : "[0-9]{2}[01][0-9][0123][0-9]-(([0-9A-Fa-f]{12})|undefined)",
"float" : "-?\\d+(\\.\\d+(E\\-?\\d+)?)?",
"hash" : "([0-9A-Fa-f]{40,64})|undefined",
"integer" : "-?\\d+(\\+)?",
"short_hash" : "([0-9A-Fa-f]{12})|undefined",
"version" : "Unknown|unknown.format|unknown|UNKNOWN|((\\d+\\.?)*\\d+)"
}
},
"version" : "4244"
}

View File

@@ -0,0 +1,84 @@
{
"groups" : [ {
"id" : "mp.plugin.manager",
"builds" : [ ],
"versions" : [ {
"from" : "8"
} ],
"rules" : {
"event_id" : [ "{enum#__event_id}" ],
"event_data" : {
"acceptance_result" : [ "{enum:ACCEPTED|DECLINED|AUTO_ACCEPTED}" ],
"enabled_state" : [ "{enum:ENABLED|DISABLED}" ],
"group" : [ "{enum:BUNDLED_UPDATE|UPDATE|INSTALLING|INSTALLED|SEARCH_INSTALLED|SEARCH|STAFF_PICKS|NEW_AND_UPDATED|TOP_DOWNLOADS|TOP_RATED|CUSTOM_REPOSITORY|INTERNAL|SUGGESTED}" ],
"index" : [ "{regexp#integer}" ],
"localSearchFeatures.isBundled" : [ "{enum#boolean}" ],
"localSearchFeatures.isDisabled" : [ "{enum#boolean}" ],
"localSearchFeatures.isDownloaded" : [ "{enum#boolean}" ],
"localSearchFeatures.isEnabled" : [ "{enum#boolean}" ],
"localSearchFeatures.isInvalid" : [ "{enum#boolean}" ],
"localSearchFeatures.isUpdateNeeded" : [ "{enum#boolean}" ],
"localSearchFeatures.tagFiltersCount" : [ "{regexp#integer}" ],
"localSearchFeatures.vendorFiltersCount" : [ "{regexp#integer}" ],
"localSearchFeatures.withAttributes" : [ "{enum#boolean}" ],
"marketplaceSearchFeatures.customRepositoryCount" : [ "{regexp#integer}" ],
"marketplaceSearchFeatures.isStaffPicks" : [ "{enum#boolean}" ],
"marketplaceSearchFeatures.isSuggested" : [ "{enum#boolean}" ],
"marketplaceSearchFeatures.marketplaceCustomRepositoryCount" : [ "{regexp#integer}" ],
"marketplaceSearchFeatures.sortBy" : [ "{enum:UPDATE_DATE|DOWNLOADS|RATING|NAME|RELEVANCE}" ],
"marketplaceSearchFeatures.tagsListFilter" : [ "{util#mp_tags_list}" ],
"marketplaceSearchFeatures.vendorsListFilter" : [ "{util#mp_vendors_list}" ],
"plugin" : [ "{util#plugin}" ],
"plugin_type" : [ "{util#plugin_type}" ],
"plugin_version" : [ "{util#plugin_version}" ],
"previous_version" : [ "{util#plugin_version}" ],
"resultsFeatures.isEmpty" : [ "{enum#boolean}" ],
"resultsFeatures.reportLimit" : [ "{regexp#integer}" ],
"resultsFeatures.results.byJetBrains" : [ "{enum#boolean}" ],
"resultsFeatures.results.marketplaceInfo.date" : [ "{regexp#integer}" ],
"resultsFeatures.results.marketplaceInfo.downloads" : [ "{regexp#integer}" ],
"resultsFeatures.results.marketplaceInfo.isPaid" : [ "{enum#boolean}" ],
"resultsFeatures.results.marketplaceInfo.marketplaceId" : [ "{regexp#integer}" ],
"resultsFeatures.results.marketplaceInfo.marketplaceRating" : [ "{regexp#float}" ],
"resultsFeatures.results.nameLength" : [ "{regexp#integer}" ],
"resultsFeatures.results.plugin" : [ "{util#plugin}" ],
"resultsFeatures.results.plugin_type" : [ "{util#plugin_type}" ],
"resultsFeatures.results.plugin_version" : [ "{util#plugin_version}" ],
"resultsFeatures.total" : [ "{regexp#integer}" ],
"signature_check_result" : [ "{enum:INVALID_SIGNATURE|MISSING_SIGNATURE|WRONG_SIGNATURE|SUCCESSFUL}" ],
"source" : [ "{enum:MARKETPLACE|CUSTOM_REPOSITORY|FROM_DISK}" ],
"userQueryFeatures.isEmptyQuery" : [ "{enum#boolean}" ],
"userQueryFeatures.queryContainsAbbreviations" : [ "{enum#boolean}" ],
"userQueryFeatures.queryContainsPath" : [ "{enum#boolean}" ],
"userQueryFeatures.queryContainsSpaces" : [ "{enum#boolean}" ],
"userQueryFeatures.queryIsAllLowercase" : [ "{enum#boolean}" ],
"userQueryFeatures.queryIsAllUppercase" : [ "{enum#boolean}" ],
"userQueryFeatures.queryIsCamelCase" : [ "{enum#boolean}" ],
"userQueryFeatures.queryLength" : [ "{regexp#integer}" ],
"userQueryFeatures.withHANSymbols" : [ "{enum#boolean}" ],
"userQueryFeatures.wordCharsAndDelimitersOnly" : [ "{enum#boolean}" ],
"userQueryFeatures.wordsNumber" : [ "{regexp#integer}" ]
},
"enums" : {
"__event_id" : [ "plugin.install.third.party.check", "plugin.search.card.opened", "plugin.signature.warning.shown", "plugin.state.changed", "search.reset", "plugin.installation.finished", "plugin.signature.check.result", "marketplace.tab.search", "plugin.installation.started", "installed.tab.search", "plugin.was.removed" ]
}
}
} ],
"rules" : {
"enums" : {
"boolean" : [ "true", "false", "TRUE", "FALSE", "True", "False" ],
"plugin_type" : [ "JVM_CORE", "PLATFORM", "JB_BUNDLED", "JB_NOT_BUNDLED", "LISTED", "NOT_LISTED", "JB_UPDATED_BUNDLED", "UNKNOWN", "FROM_SOURCES" ]
},
"regexps" : {
"count" : "\\d+K?M?\\+?",
"date_YYYY-MM-DD_HH" : "^[12][0-9]{3}-(0[0-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])( ([0-1][0-9]|2[0-3]))?$",
"date_short_hash" : "[0-9]{2}[01][0-9][0123][0-9]-(([0-9A-Fa-f]{12})|undefined)",
"float" : "-?\\d+(\\.\\d+(E\\-?\\d+)?)?",
"hash" : "([0-9A-Fa-f]{40,64})|undefined",
"integer" : "-?\\d+(\\+)?",
"short_hash" : "([0-9A-Fa-f]{12})|undefined",
"version" : "Unknown|unknown.format|unknown|UNKNOWN|((\\d+\\.?)*\\d+)"
}
},
"version" : "4244"
}

View File

@@ -0,0 +1,38 @@
/*
* Available context bindings:
* COLUMNS List<DataColumn>
* ROWS Iterable<DataRow>
* OUT { append() }
* FORMATTER { format(row, col); formatValue(Object, col); getTypeName(Object, col); isStringLiteral(Object, col); }
* TRANSPOSED Boolean
* plus ALL_COLUMNS, TABLE, DIALECT
*
* where:
* DataRow { rowNumber(); first(); last(); data(): List<Object>; value(column): Object }
* DataColumn { columnNumber(), name() }
*/
import static java.math.MathContext.DECIMAL128
BigDecimal RES = 0
int i = 0
ROWS.each { row ->
COLUMNS.each { column ->
def value = row.value(column)
if (value instanceof Number) {
RES = RES.add(value, DECIMAL128)
i++
}
else if (value.toString().isBigDecimal()) {
RES = RES.add(value.toString().toBigDecimal(), DECIMAL128)
i++
}
}
}
if (i > 0) {
RES = RES.divide(i, DECIMAL128)
OUT.append(RES.toString())
}
else {
OUT.append("Not enough values")
}

View File

@@ -0,0 +1,53 @@
/*
* Available context bindings:
* COLUMNS List<DataColumn>
* ROWS Iterable<DataRow>
* OUT { append() }
* FORMATTER { format(row, col); formatValue(Object, col); getTypeName(Object, col); isStringLiteral(Object, col); }
* TRANSPOSED Boolean
* plus ALL_COLUMNS, TABLE, DIALECT
*
* where:
* DataRow { rowNumber(); first(); last(); data(): List<Object>; value(column): Object }
* DataColumn { columnNumber(), name() }
*/
import static java.math.MathContext.DECIMAL128
def toBigDecimal = { value ->
value instanceof Number ? value as BigDecimal :
value.toString().isBigDecimal() ? value.toString() as BigDecimal :
null
}
def values = []
ROWS.each { row ->
COLUMNS.each { column ->
def bigDecimal = toBigDecimal(row.value(column))
if (bigDecimal != null) {
values.add(bigDecimal)
}
}
}
if (values.isEmpty()) {
OUT.append("Not enough values")
return
}
def sum = BigDecimal.ZERO
values.forEach { value ->
sum = sum.add(value, DECIMAL128)
}
def avg = sum.divide(values.size(), DECIMAL128)
def sumSquaredDiff = BigDecimal.ZERO
values.each { value ->
BigDecimal diff = value.subtract(avg, DECIMAL128)
sumSquaredDiff = sumSquaredDiff.add(diff.multiply(diff, DECIMAL128), DECIMAL128)
}
def variance = sumSquaredDiff.divide(values.size(), DECIMAL128)
def standardDeviation = variance.sqrt(DECIMAL128)
def cv = standardDeviation.divide(avg, DECIMAL128)
OUT.append((cv * 100).round(2) + "%")

View File

@@ -0,0 +1,15 @@
/*
* Available context bindings:
* COLUMNS List<DataColumn>
* ROWS Iterable<DataRow>
* OUT { append() }
* FORMATTER { format(row, col); formatValue(Object, col); getTypeName(Object, col); isStringLiteral(Object, col); }
* TRANSPOSED Boolean
* plus ALL_COLUMNS, TABLE, DIALECT
*
* where:
* DataRow { rowNumber(); first(); last(); data(): List<Object>; value(column): Object }
* DataColumn { columnNumber(), name() }
*/
OUT.append(COLUMNS.size().toString())

View File

@@ -0,0 +1,21 @@
/*
* Available context bindings:
* COLUMNS List<DataColumn>
* ROWS Iterable<DataRow>
* OUT { append() }
* FORMATTER { format(row, col); formatValue(Object, col); getTypeName(Object, col); isStringLiteral(Object, col); }
* TRANSPOSED Boolean
* plus ALL_COLUMNS, TABLE, DIALECT
*
* where:
* DataRow { rowNumber(); first(); last(); data(): List<Object>; value(column): Object }
* DataColumn { columnNumber(), name() }
*/
def RES = 0G
ROWS.each { row ->
COLUMNS.each { column ->
RES += 1
}
}
OUT.append(RES.toString())

View File

@@ -0,0 +1,27 @@
/*
* Available context bindings:
* COLUMNS List<DataColumn>
* ROWS Iterable<DataRow>
* OUT { append() }
* FORMATTER { format(row, col); formatValue(Object, col); getTypeName(Object, col); isStringLiteral(Object, col); }
* TRANSPOSED Boolean
* plus ALL_COLUMNS, TABLE, DIALECT
*
* where:
* DataRow { rowNumber(); first(); last(); data(): List<Object>; value(column): Object }
* DataColumn { columnNumber(), name() }
*/
def RES = 0G
ROWS.each { row ->
COLUMNS.each { column ->
def value = row.value(column)
if (value instanceof Number) {
RES += 1
}
else if (value.toString().isBigDecimal()) {
RES += 1
}
}
}
OUT.append(RES.toString())

View File

@@ -0,0 +1,32 @@
/*
* Available context bindings:
* COLUMNS List<DataColumn>
* ROWS Iterable<DataRow>
* OUT { append() }
* FORMATTER { format(row, col); formatValue(Object, col); getTypeName(Object, col); isStringLiteral(Object, col); }
* TRANSPOSED Boolean
* plus ALL_COLUMNS, TABLE, DIALECT
*
* where:
* DataRow { rowNumber(); first(); last(); data(): List<Object>; value(column): Object }
* DataColumn { columnNumber(), name() }
*/
values = new ArrayList<BigDecimal>()
ROWS.each { row ->
COLUMNS.each { column ->
def value = row.value(column)
if (value instanceof Number) {
values.add(value as BigDecimal)
}
else if (value.toString().isBigDecimal()) {
values.add(value.toString() as BigDecimal)
}
}
}
if (values.size() == 0) {
OUT.append("Not enough values")
return
}
OUT.append(Collections.max(values).toString())

View File

@@ -0,0 +1,42 @@
/*
* Available context bindings:
* COLUMNS List<DataColumn>
* ROWS Iterable<DataRow>
* OUT { append() }
* FORMATTER { format(row, col); formatValue(Object, col); getTypeName(Object, col); isStringLiteral(Object, col); }
* TRANSPOSED Boolean
* plus ALL_COLUMNS, TABLE, DIALECT
*
* where:
* DataRow { rowNumber(); first(); last(); data(): List<Object>; value(column): Object }
* DataColumn { columnNumber(), name() }
*/
import static java.math.MathContext.DECIMAL128
def toBigDecimal = { value ->
value instanceof Number ? value as BigDecimal :
value.toString().isBigDecimal() ? value.toString() as BigDecimal :
null
}
def values = []
ROWS.each { row ->
COLUMNS.each { column ->
def bigDecimal = toBigDecimal(row.value(column))
if (bigDecimal != null) {
values.add(bigDecimal)
}
}
}
if (values.isEmpty()) {
OUT.append("Not enough values")
return
}
elementsNumber = values.size()
Collections.sort(values)
mid = (int)elementsNumber / 2
RES = elementsNumber % 2 != 0 ? values[mid] : values[mid].add(values[mid - 1], DECIMAL128).divide(2, DECIMAL128)
OUT.append(RES.toString())

View File

@@ -0,0 +1,31 @@
/*
* Available context bindings:
* COLUMNS List<DataColumn>
* ROWS Iterable<DataRow>
* OUT { append() }
* FORMATTER { format(row, col); formatValue(Object, col); getTypeName(Object, col); isStringLiteral(Object, col); }
* TRANSPOSED Boolean
* plus ALL_COLUMNS, TABLE, DIALECT
*
* where:
* DataRow { rowNumber(); first(); last(); data(): List<Object>; value(column): Object }
* DataColumn { columnNumber(), name() }
*/
values = new ArrayList<BigDecimal>()
ROWS.each { row ->
COLUMNS.each { column ->
def value = row.value(column)
if (value instanceof Number) {
values.add(value as BigDecimal)
}
else if (value.toString().isBigDecimal()) {
values.add(value.toString() as BigDecimal)
}
}
}
if (values.size() == 0) {
OUT.append("Not enough values")
return
}
OUT.append(Collections.min(values).toString())

View File

@@ -0,0 +1,15 @@
/*
* Available context bindings:
* COLUMNS List<DataColumn>
* ROWS Iterable<DataRow>
* OUT { append() }
* FORMATTER { format(row, col); formatValue(Object, col); getTypeName(Object, col); isStringLiteral(Object, col); }
* TRANSPOSED Boolean
* plus ALL_COLUMNS, TABLE, DIALECT
*
* where:
* DataRow { rowNumber(); first(); last(); data(): List<Object>; value(column): Object }
* DataColumn { columnNumber(), name() }
*/
OUT.append(ROWS.size().toString())

View File

@@ -0,0 +1,29 @@
/*
* Available context bindings:
* COLUMNS List<DataColumn>
* ROWS Iterable<DataRow>
* OUT { append() }
* FORMATTER { format(row, col); formatValue(Object, col); getTypeName(Object, col); isStringLiteral(Object, col); }
* TRANSPOSED Boolean
* plus ALL_COLUMNS, TABLE, DIALECT
*
* where:
* DataRow { rowNumber(); first(); last(); data(): List<Object>; value(column): Object }
* DataColumn { columnNumber(), name() }
*/
import static java.math.MathContext.DECIMAL128
BigDecimal RES = 0
ROWS.each { row ->
COLUMNS.each { column ->
def value = row.value(column)
if (value instanceof Number) {
RES = RES.add(value, DECIMAL128)
}
else if (value.toString().isBigDecimal()) {
RES = RES.add(value.toString().toBigDecimal(), DECIMAL128)
}
}
}
OUT.append(RES.toString())

View File

@@ -0,0 +1,37 @@
/*
* Available context bindings:
* COLUMNS List<DataColumn>
* ROWS Iterable<DataRow>
* OUT { append() }
* FORMATTER { format(row, col); formatValue(Object, col); getTypeName(Object, col); isStringLiteral(Object, col); }
* TRANSPOSED Boolean
* plus ALL_COLUMNS, TABLE, DIALECT
*
* where:
* DataRow { rowNumber(); first(); last(); data(): List<Object>; value(column): Object }
* DataColumn { columnNumber(), name() }
*/
SEPARATOR = ","
QUOTE = "\""
NEWLINE = System.getProperty("line.separator")
def printRow = { values, valueToString ->
values.eachWithIndex { value, idx ->
def str = valueToString(value)
def q = str.contains(SEPARATOR) || str.contains(QUOTE) || str.contains(NEWLINE)
OUT.append(q ? QUOTE : "")
.append(str.replace(QUOTE, QUOTE + QUOTE))
.append(q ? QUOTE : "")
.append(idx != values.size() - 1 ? SEPARATOR : NEWLINE)
}
}
if (!TRANSPOSED) {
ROWS.each { row -> printRow(COLUMNS, { FORMATTER.format(row, it) }) }
}
else {
def values = COLUMNS.collect { new ArrayList<String>() }
ROWS.each { row -> COLUMNS.eachWithIndex { col, i -> values[i].add(FORMATTER.format(row, col)) } }
values.each { printRow(it, { it }) }
}

View File

@@ -0,0 +1,57 @@
/*
* Available context bindings:
* COLUMNS List<DataColumn>
* ROWS Iterable<DataRow>
* OUT { append() }
* FORMATTER { format(row, col); formatValue(Object, col); getTypeName(Object, col); isStringLiteral(Object, col); }
* TRANSPOSED Boolean
* plus ALL_COLUMNS, TABLE, DIALECT
*
* where:
* DataRow { rowNumber(); first(); last(); data(): List<Object>; value(column): Object }
* DataColumn { columnNumber(), name() }
*/
import static com.intellij.openapi.util.text.StringUtil.escapeXmlEntities
NEWLINE = System.getProperty("line.separator")
def HTML_PATTERN = ~"<.+>"
def printRow = { values, tag, valueToString ->
OUT.append("$NEWLINE<tr>$NEWLINE")
values.each {
def str = valueToString(it)
def escaped = str ==~ HTML_PATTERN
? str
: escapeXmlEntities((str as String).replaceAll("\\t|\\b|\\f", "")).replaceAll("\\r|\\n|\\r\\n", "<br/>")
OUT.append(" <$tag>$escaped</$tag>$NEWLINE")
}
OUT.append("</tr>")
}
OUT.append(
"""<!DOCTYPE html>
<html>
<head>
<title></title>
<meta charset="UTF-8">
</head>
<body>
<table border="1" style="border-collapse:collapse">""")
if (!TRANSPOSED) {
printRow(COLUMNS, "th") { it.name() }
ROWS.each { row -> printRow(COLUMNS, "td") { FORMATTER.format(row, it) } }
}
else {
def values = COLUMNS.collect { new ArrayList<String>( [it.name()] ) }
ROWS.each { row -> COLUMNS.eachWithIndex { col, i -> values[i].add(FORMATTER.format(row, col)) } }
values.each { printRow(it, "td", { it }) }
}
OUT.append("""
</table>
</body>
</html>
""")

View File

@@ -0,0 +1,49 @@
function eachWithIdx(iterable, f) { var i = iterable.iterator(); var idx = 0; while (i.hasNext()) f(i.next(), idx++); }
function mapEach(iterable, f) { var vs = []; eachWithIdx(iterable, function (i) { vs.push(f(i));}); return vs; }
function escape(str) {
str = str.replace(/\t|\b|\f/g, "");
str = com.intellij.openapi.util.text.StringUtil.escapeXml(str);
str = str.replace(/\r|\n|\r\n/g, "<br/>");
return str;
}
var isHTML = RegExp.prototype.test.bind(/^<.+>$/);
var NEWLINE = "\n";
function output() { for (var i = 0; i < arguments.length; i++) { OUT.append(arguments[i]); } }
function outputRow(items, tag) {
output("<tr>");
for (var i = 0; i < items.length; i++)
output("<", tag, ">", isHTML(items[i]) ? items[i] : escape(items[i]), "</", tag, ">");
output("</tr>", NEWLINE);
}
output("<!DOCTYPE html>", NEWLINE,
"<html>", NEWLINE,
"<head>", NEWLINE,
"<title></title>", NEWLINE,
"<meta charset=\"UTF-8\">", NEWLINE,
"</head>", NEWLINE,
"<body>", NEWLINE,
"<table border=\"1\" style=\"border-collapse:collapse\">", NEWLINE);
if (TRANSPOSED) {
var values = mapEach(COLUMNS, function(col) { return [col.name()]; });
eachWithIdx(ROWS, function (row) {
eachWithIdx(COLUMNS, function (col, i) {
values[i].push(FORMATTER.format(row, col));
});
});
eachWithIdx(COLUMNS, function (_, i) { outputRow(values[i], "td"); });
}
else {
outputRow(mapEach(COLUMNS, function (col) { return col.name(); }), "th");
eachWithIdx(ROWS, function (row) {
outputRow(mapEach(COLUMNS, function (col) { return FORMATTER.format(row, col); }), "td")
});
}
output("</table>", NEWLINE,
"</body>", NEWLINE,
"</html>", NEWLINE);

View File

@@ -0,0 +1,70 @@
/*
* Available context bindings:
* COLUMNS List<DataColumn>
* ROWS Iterable<DataRow>
* OUT { append() }
* FORMATTER { format(row, col); formatValue(Object, col); getTypeName(Object, col); isStringLiteral(Object, col); }
* TRANSPOSED Boolean
* plus ALL_COLUMNS, TABLE, DIALECT
*
* where:
* DataRow { rowNumber(); first(); last(); data(): List<Object>; value(column): Object }
* DataColumn { columnNumber(), name() }
*/
import static com.intellij.openapi.util.text.StringUtil.escapeStringCharacters as escapeStr
NEWLINE = System.getProperty("line.separator")
INDENT = " "
def printJSON(level, col, o) {
switch (o) {
case null: OUT.append("null"); break
case Tuple: printJSON(level, o[0], o[1]); break
case Map:
OUT.append("{")
o.entrySet().eachWithIndex { entry, i ->
OUT.append("${i > 0 ? "," : ""}$NEWLINE${INDENT * (level + 1)}")
OUT.append("\"${escapeStr(entry.getKey().toString())}\"")
OUT.append(": ")
printJSON(level + 1, col, entry.getValue())
}
OUT.append("$NEWLINE${INDENT * level}}")
break
case Object[]:
case Iterable:
OUT.append("[")
def plain = true
o.eachWithIndex { item, i ->
plain = item == null || item instanceof Number || item instanceof Boolean || item instanceof String
if (plain) {
OUT.append(i > 0 ? ", " : "")
}
else {
OUT.append("${i > 0 ? "," : ""}$NEWLINE${INDENT * (level + 1)}")
}
printJSON(level + 1, col, item)
}
if (plain) OUT.append("]") else OUT.append("$NEWLINE${INDENT * level}]")
break
case Boolean: OUT.append("$o"); break
default:
def str = FORMATTER.formatValue(o, col)
def typeName = FORMATTER.getTypeName(o, col)
def shouldQuote = FORMATTER.isStringLiteral(o, col) && !(typeName.equalsIgnoreCase("json") || typeName.equalsIgnoreCase("jsonb"))
OUT.append(shouldQuote ? "\"${escapeStr(str)}\"" : str);
break
}
}
printJSON(0, null, ROWS.transform { row ->
def map = new LinkedHashMap<String, Object>()
COLUMNS.each { col ->
if (row.hasValue(col)) {
def val = row.value(col)
map.put(col.name(), new Tuple(col, val))
}
}
map
})

View File

@@ -0,0 +1,65 @@
package extensions.data.extractors
NEWLINE = System.getProperty("line.separator")
SEPARATOR = "|"
BACKSLASH = "\\"
BACKQUOTE = "`"
LTAG = "<"
RTAG = ">"
ASTERISK = "*"
UNDERSCORE = "_"
LPARENTH = "("
RPARENTH = ")"
LBRACKET = "["
RBRACKET = "]"
TILDE = "~"
def printRow = { values, firstBold = false, valueToString ->
values.eachWithIndex { value, idx ->
def str = valueToString(value)
.replace(BACKSLASH, BACKSLASH + BACKSLASH)
.replace(SEPARATOR, BACKSLASH + SEPARATOR)
.replace(BACKQUOTE, BACKSLASH + BACKQUOTE)
.replace(ASTERISK, BACKSLASH + ASTERISK)
.replace(UNDERSCORE, BACKSLASH + UNDERSCORE)
.replace(LPARENTH, BACKSLASH + LPARENTH)
.replace(RPARENTH, BACKSLASH + RPARENTH)
.replace(LBRACKET, BACKSLASH + LBRACKET)
.replace(RBRACKET, BACKSLASH + RBRACKET)
.replace(TILDE, BACKSLASH + TILDE)
.replace(LTAG, "&lt;")
.replace(RTAG, "&gt;")
.replaceAll("\r\n|\r|\n", "<br/>")
.replaceAll("\t|\b|\f", "")
OUT.append("| ")
.append(firstBold && idx == 0 ? "**" : "")
.append(str)
.append(firstBold && idx == 0 ? "**" : "")
.append(idx != values.size() - 1 ? " " : " |" + NEWLINE)
}
}
if (TRANSPOSED) {
def values = COLUMNS.collect { new ArrayList<String>([it.name()]) }
def rowCount = 0
ROWS.forEach { row ->
COLUMNS.eachWithIndex { col, i -> values[i].add(FORMATTER.format(row, col)) }
rowCount++
}
for (int i = 0; i <= rowCount; i++) {
OUT.append("| ")
}
OUT.append("|" + NEWLINE)
for (int i = 0; i <= rowCount; i++) {
OUT.append("| :- ")
}
OUT.append("|" + NEWLINE)
values.each { printRow(it, true) { it } }
}
else {
printRow(COLUMNS) { it.name() }
COLUMNS.each { OUT.append("| :--- ") }
OUT.append("|" + NEWLINE)
ROWS.each { row -> printRow(COLUMNS) { FORMATTER.format(row, it) } }
}

View File

@@ -0,0 +1,34 @@
/*
* Available context bindings:
* COLUMNS List<DataColumn>
* ROWS Iterable<DataRow>
* OUT { append() }
* FORMATTER { format(row, col); formatValue(Object, col); getTypeName(Object, col); isStringLiteral(Object, col); }
* TRANSPOSED Boolean
* plus ALL_COLUMNS, TABLE, DIALECT
*
* where:
* DataRow { rowNumber(); first(); last(); data(): List<Object>; value(column): Object }
* DataColumn { columnNumber(), name() }
*/
SEPARATOR = ", "
QUOTE = "'"
STRING_PREFIX = DIALECT.getDbms().isMicrosoft() ? "N" : ""
KEYWORDS_LOWERCASE = com.intellij.database.util.DbSqlUtil.areKeywordsLowerCase(PROJECT)
KW_NULL = KEYWORDS_LOWERCASE ? "null" : "NULL"
first = true
ROWS.each { row ->
COLUMNS.each { column ->
def value = row.value(column)
def stringValue = value == null ? KW_NULL : FORMATTER.formatValue(value, column)
def isStringLiteral = value != null && FORMATTER.isStringLiteral(value, column)
if (isStringLiteral && DIALECT.getDbms().isMysql()) stringValue = stringValue.replace("\\", "\\\\")
OUT.append(first ? "" : SEPARATOR)
.append(isStringLiteral ? (STRING_PREFIX + QUOTE) : "")
.append(stringValue ? stringValue.replace(QUOTE, QUOTE + QUOTE) : stringValue)
.append(isStringLiteral ? QUOTE : "")
first = false
}
}

View File

@@ -0,0 +1,144 @@
import com.intellij.openapi.util.text.StringUtil
/*
* Available context bindings:
* COLUMNS List<DataColumn>
* ROWS Iterable<DataRow>
* OUT { append() }
* FORMATTER { format(row, col); formatValue(Object, col); getTypeName(Object, col); isStringLiteral(Object, col); }
* TRANSPOSED Boolean
* plus ALL_COLUMNS, TABLE, DIALECT
*
* where:
* DataRow { rowNumber(); first(); last(); data(): List<Object>; value(column): Object }
* DataColumn { columnNumber(), name() }
*/
WIDTH_BASED_ON_CONTENT = -1
PIPE = "|"
SPACE = " "
CROSS = "+"
MINUS = "-"
ROW_SEPARATORS = false
COLUMN_WIDTH = WIDTH_BASED_ON_CONTENT
NEWLINE = System.getProperty("line.separator")
static def splitByLines(values, size) {
def splitValues = new ArrayList<>()
def maxLines = 0
for (int i = 0; i < size; i++) {
def splitValue = StringUtil.splitByLines(values(i))
splitValues.add(splitValue)
maxLines = Math.max(maxLines, splitValue.size())
}
def byLines = new ArrayList<>(maxLines)
for (int i = 0; i < maxLines; i++) {
def lineValues = new ArrayList<>()
byLines.add(lineValues)
for (int j = 0; j < splitValues.size(); j++) {
def splitValue = splitValues[j]
lineValues.add(splitValue.size() <= i ? null : splitValue[i])
}
}
return byLines
}
def printRow(values, size, width = { COLUMN_WIDTH }, padding = SPACE, separator = { PIPE }) {
def byLines = splitByLines(values, size)
byLines.each { line ->
def lineSize = line.size()
if (lineSize > 0) OUT.append(separator(-1))
for (int i = 0; i < lineSize; i++) {
def value = line[i] == null ? "" : line.get(i)
def curWidth = width(i)
OUT.append(value.padRight(curWidth, padding))
OUT.append(separator(i))
}
OUT.append(NEWLINE)
}
}
def printRows() {
def colNames = COLUMNS.collect { it.name() }
def calcWidth = COLUMN_WIDTH == WIDTH_BASED_ON_CONTENT
def rows
def width
def rowFormatter
if (calcWidth) {
rows = new ArrayList<>()
def widths = new int[COLUMNS.size()]
COLUMNS.eachWithIndex { column, idx -> widths[idx] = column.name().length() }
ROWS.each { row ->
def rowValues = COLUMNS.withIndex().collect { col, idx ->
def value = FORMATTER.format(row, col)
widths[idx] = Math.max(widths[idx], value.length())
value
}
rows.add(rowValues)
}
width = { widths[it] }
rowFormatter = { it }
}
else {
rows = ROWS
width = { COLUMN_WIDTH }
rowFormatter = { COLUMNS.collect { col -> FORMATTER.format(it, col) } }
}
printRow({""}, COLUMNS.size(), { width(it) }, MINUS) { CROSS }
printRow( { colNames[it] }, COLUMNS.size()) { width(it) }
def first = true
rows.each { row ->
def rowValues = rowFormatter(row)
if (first || ROW_SEPARATORS) printRow({""}, COLUMNS.size(), { width(it) }, MINUS) { first ? CROSS : MINUS }
printRow({ rowValues[it] }, rowValues.size()) { width(it) }
first = false
}
printRow({""}, COLUMNS.size(), { width(it) }, MINUS) { CROSS }
}
def printRowsTransposed() {
def calcWidth = COLUMN_WIDTH == WIDTH_BASED_ON_CONTENT
if (calcWidth) {
COLUMN_WIDTHS = new ArrayList<Integer>()
COLUMN_WIDTHS.add(0)
}
def valuesByRow = COLUMNS.collect { col ->
if (calcWidth) COLUMN_WIDTHS.set(0, Math.max(COLUMN_WIDTHS[0], col.name().length()))
new ArrayList<String>([col.name()])
}
def rowCount = 1
ROWS.each { row ->
rowCount++
COLUMNS.eachWithIndex { col, i ->
def formattedValue = FORMATTER.format(row, col)
valuesByRow[i].add(formattedValue)
def widthIdx = rowCount - 1
def length = formattedValue.length()
if (calcWidth) {
if (COLUMN_WIDTHS.size() == widthIdx) COLUMN_WIDTHS.add(length)
COLUMN_WIDTHS.set(widthIdx, Math.max(COLUMN_WIDTHS[widthIdx], length))
}
}
}
valuesByRow.each { row ->
printRow({ "" }, rowCount, { calcWidth ? COLUMN_WIDTHS[it] : COLUMN_WIDTH }, MINUS) {
it <= 0 ? CROSS : it == rowCount - 1 ? CROSS : MINUS
}
printRow({ row[it] }, row.size()) { calcWidth ? COLUMN_WIDTHS[it] : COLUMN_WIDTH }
}
printRow({ "" }, rowCount, { calcWidth ? COLUMN_WIDTHS[it] : COLUMN_WIDTH }, MINUS) {
it <= 0 ? CROSS : it == rowCount - 1 ? CROSS : MINUS
}
}
if (TRANSPOSED) {
printRowsTransposed()
}
else {
printRows()
}

View File

@@ -0,0 +1,62 @@
/*
* Available context bindings:
* COLUMNS List<DataColumn>
* ROWS Iterable<DataRow>
* OUT { append() }
* FORMATTER { format(row, col); formatValue(Object, col); getTypeName(Object, col); isStringLiteral(Object, col); }
* TRANSPOSED Boolean
* plus ALL_COLUMNS, TABLE, DIALECT
*
* where:
* DataRow { rowNumber(); first(); last(); data(): List<Object>; value(column): Object }
* DataColumn { columnNumber(), name() }
*/
SEP = ", "
QUOTE = "\'"
STRING_PREFIX = DIALECT.getDbms().isMicrosoft() ? "N" : ""
NEWLINE = System.getProperty("line.separator")
KEYWORDS_LOWERCASE = com.intellij.database.util.DbSqlUtil.areKeywordsLowerCase(PROJECT)
KW_INSERT_INTO = KEYWORDS_LOWERCASE ? "insert into " : "INSERT INTO "
KW_VALUES = KEYWORDS_LOWERCASE ? "values" : "VALUES"
KW_NULL = KEYWORDS_LOWERCASE ? "null" : "NULL"
begin = true
def record(columns, dataRow) {
if (begin) {
OUT.append(KW_INSERT_INTO)
if (TABLE == null) OUT.append("MY_TABLE")
else OUT.append(TABLE.getParent().getName()).append(".").append(TABLE.getName())
OUT.append(" (")
columns.eachWithIndex { column, idx ->
OUT.append(column.name()).append(idx != columns.size() - 1 ? SEP : "")
}
OUT.append(")").append(NEWLINE)
OUT.append(KW_VALUES).append(" (")
begin = false
}
else {
OUT.append(",").append(NEWLINE)
OUT.append(" (")
}
columns.eachWithIndex { column, idx ->
def value = dataRow.value(column)
def stringValue = value == null ? KW_NULL : FORMATTER.formatValue(value, column)
def isStringLiteral = value != null && FORMATTER.isStringLiteral(value, column)
if (isStringLiteral && DIALECT.getDbms().isMysql()) stringValue = stringValue.replace("\\", "\\\\")
OUT.append(isStringLiteral ? (STRING_PREFIX + QUOTE) : "")
.append(stringValue ? stringValue.replace(QUOTE, QUOTE + QUOTE) : stringValue)
.append(isStringLiteral ? QUOTE : "")
.append(idx != columns.size() - 1 ? SEP : "")
}
OUT.append(")")
}
ROWS.each { row -> record(COLUMNS, row) }
OUT.append(";")

View File

@@ -0,0 +1,49 @@
/*
* Available context bindings:
* COLUMNS List<DataColumn>
* ROWS Iterable<DataRow>
* OUT { append() }
* FORMATTER { format(row, col); formatValue(Object, col); getTypeName(Object, col); isStringLiteral(Object, col); }
* TRANSPOSED Boolean
* plus ALL_COLUMNS, TABLE, DIALECT
*
* where:
* DataRow { rowNumber(); first(); last(); data(): List<Object>; value(column): Object }
* DataColumn { columnNumber(), name() }
*/
SEP = ", "
QUOTE = "\'"
STRING_PREFIX = DIALECT.getDbms().isMicrosoft() ? "N" : ""
NEWLINE = System.getProperty("line.separator")
KEYWORDS_LOWERCASE = com.intellij.database.util.DbSqlUtil.areKeywordsLowerCase(PROJECT)
KW_INSERT_INTO = KEYWORDS_LOWERCASE ? "insert into " : "INSERT INTO "
KW_VALUES = KEYWORDS_LOWERCASE ? ") values (" : ") VALUES ("
KW_NULL = KEYWORDS_LOWERCASE ? "null" : "NULL"
def record(columns, dataRow) {
OUT.append(KW_INSERT_INTO)
if (TABLE == null) OUT.append("MY_TABLE")
else OUT.append(TABLE.getParent().getName()).append(".").append(TABLE.getName())
OUT.append(" (")
columns.eachWithIndex { column, idx ->
OUT.append(column.name()).append(idx != columns.size() - 1 ? SEP : "")
}
OUT.append(KW_VALUES)
columns.eachWithIndex { column, idx ->
def value = dataRow.value(column)
def stringValue = value == null ? KW_NULL : FORMATTER.formatValue(value, column)
def isStringLiteral = value != null && FORMATTER.isStringLiteral(value, column)
if (isStringLiteral && DIALECT.getDbms().isMysql()) stringValue = stringValue.replace("\\", "\\\\")
OUT.append(isStringLiteral ? (STRING_PREFIX + QUOTE) : "")
.append(isStringLiteral ? stringValue.replace(QUOTE, QUOTE + QUOTE) : stringValue)
.append(isStringLiteral ? QUOTE : "")
.append(idx != columns.size() - 1 ? SEP : "")
}
OUT.append(");").append(NEWLINE)
}
ROWS.each { row -> record(COLUMNS, row) }

View File

@@ -0,0 +1,93 @@
/*
* Available context bindings:
* COLUMNS List<DataColumn>
* ROWS Iterable<DataRow>
* OUT { append() }
* FORMATTER { format(row, col); formatValue(Object, col); getTypeName(Object, col); isStringLiteral(Object, col); }
* TRANSPOSED Boolean
* plus ALL_COLUMNS, TABLE, DIALECT
*
* where:
* DataRow { rowNumber(); first(); last(); data(): List<Object>; value(column): Object }
* DataColumn { columnNumber(), name() }
*/
import com.intellij.openapi.util.text.StringUtil
import java.util.regex.Pattern
NEWLINE = System.getProperty("line.separator")
pattern = Pattern.compile("[^\\w\\d]")
def escapeTag(name) {
name = pattern.matcher(name).replaceAll("_")
return name.isEmpty() || !Character.isLetter(name.charAt(0)) ? "_$name" : name
}
def printRow(level, rowTag, values) {
def prefix = "$NEWLINE${StringUtil.repeat(" ", level)}"
OUT.append("$prefix<$rowTag>")
values.each { name, col, valuesName, value ->
switch (value) {
case Map:
def mapValues = new ArrayList<Tuple>()
value.each { key, v -> mapValues.add(new Tuple(escapeTag(key.toString()), col, key.toString(), v)) }
printRow(level + 1, name, mapValues)
break
case Object[]:
case Iterable:
def listItems = new ArrayList<Tuple>()
def itemName = valuesName != null ? escapeTag(StringUtil.unpluralize(valuesName) ?: "item") : "item"
value.collect { v -> listItems.add(new Tuple(itemName, col, null, v)) }
printRow(level + 1, name, listItems)
break
default:
OUT.append("$prefix <$name>")
if (value == null) OUT.append("null")
else {
def formattedValue = FORMATTER.formatValue(value, col)
if (isXmlString(formattedValue)) OUT.append(formattedValue)
else OUT.append(StringUtil.escapeXmlEntities(formattedValue))
}
OUT.append("</$name>")
}
}
OUT.append("$prefix</$rowTag>")
}
def isXmlString(string) {
return string.startsWith("<") && string.endsWith(">") && (string.contains("</") || string.contains("/>"))
}
OUT.append(
"""<?xml version="1.0" encoding="UTF-8"?>
<data>""")
if (!TRANSPOSED) {
ROWS.each { row ->
def values = COLUMNS
.findAll { col -> row.hasValue(col) }
.collect { col ->
new Tuple(escapeTag(col.name()), col, col.name(), row.value(col))
}
printRow(0, "row", values)
}
}
else {
def values = COLUMNS.collect { new ArrayList<Tuple>() }
ROWS.eachWithIndex { row, rowIdx ->
COLUMNS.eachWithIndex { col, colIdx ->
if (row.hasValue(col)) {
def value = row.value(col)
values[colIdx].add(new Tuple("row${rowIdx + 1}", col, col.name(), value))
}
}
}
values.eachWithIndex { it, index ->
printRow(0, escapeTag(COLUMNS[index].name()), it)
}
}
OUT.append("""
</data>
""")

View File

@@ -0,0 +1,66 @@
// IJ: extensions = xls;xlsx displayName = XLS
package extensions.data.loaders
@Grab('org.apache.poi:poi:5.2.5')
@Grab('org.apache.poi:poi-ooxml:5.2.5')
import org.apache.poi.ss.usermodel.CellType
import org.apache.poi.ss.usermodel.WorkbookFactory
LOADER.load { ctx ->
loadXls(ctx.getParameters()["FILE"], ctx.getDataConsumer())
}
def loadXls(path, dataConsumer) {
def wb = WorkbookFactory.create(new File(path))
def evaluator = wb.getCreationHelper().createFormulaEvaluator();
def sheet = wb.getSheetAt(0)
produceSheet(sheet, evaluator, dataConsumer)
}
private void produceSheet(sheet, evaluator, dataConsumer) {
def idx = 0
sheet.forEach { row ->
def res = extractRow(row, evaluator)
if (!res.isEmpty()) {
def cur = row.getRowNum()
while (idx < cur - 1) {
dataConsumer.consume(new Object[0])
++idx
}
idx = cur
dataConsumer.consume(res.toArray())
}
}
}
private List<Object> extractRow(row, evaluator) {
def res = new ArrayList<Object>()
row.forEach { cell ->
def cur = cell.getColumnIndex()
while (res.size() < cur) {
res.add(null)
}
def v = evaluator.evaluate(cell)
def rv = cellVal(v)
res.add(rv)
}
res
}
def cellVal(cell) {
if (cell == null) return null
switch (cell.getCellType()) {
case CellType.BOOLEAN:
return cell.getBooleanCellValue()
case CellType.STRING:
return cell.getStringValue()
case CellType.NUMERIC:
return cell.getNumberValue()
case CellType.BLANK:
return null
default:
return cell.formatAsString()
}
}

View File

@@ -0,0 +1,53 @@
import com.intellij.database.model.DasObjectWithSource
import com.intellij.database.model.DasSchemaChild
import com.intellij.database.model.ObjectKind
import com.intellij.database.util.DasUtil
import com.intellij.database.util.ObjectPath
LAYOUT.ignoreDependencies = true
LAYOUT.baseName { ctx -> baseName(ctx.object) }
LAYOUT.fileScope { path -> fileScope(path) }
def baseName(obj) {
def db = DasUtil.getCatalog(obj)
def schema = DasUtil.getSchema(obj)
def file = fileName(obj)
if (db.isEmpty()) {
if (!schema.isEmpty()) return "anonymous/" + sanitize(schema) + "/" + file
return file
}
else if (schema.isEmpty()) {
return sanitize(db) + "/" + file
}
else {
return sanitize(db) + "/" + sanitize(schema) + "/" + file
}
}
def fileName(obj) {
for (def cur = obj; cur != null; cur = cur.dasParent) {
if (storeSeparately(cur)) return sanitize(cur.name)
}
return sanitize(obj.name)
}
def fileScope(path) {
def root = path.getName(0).toString()
if (root.endsWith(".sql")) return null
def next = path.getName(1).toString()
if (next.endsWith(".sql")) {
if (root == "anonymous") return null
return ObjectPath.create(root, ObjectKind.DATABASE)
}
if (root == "anonymous") return ObjectPath.create(next, ObjectKind.SCHEMA)
return ObjectPath.create(root, ObjectKind.DATABASE).append(next, ObjectKind.SCHEMA)
}
def storeSeparately(obj) {
return obj instanceof DasObjectWithSource || obj instanceof DasSchemaChild
}
def sanitize(name) {
return name.replace('/', 'slash')
}

View File

@@ -0,0 +1,42 @@
import com.intellij.database.model.DasObjectWithSource
import com.intellij.database.model.DasSchemaChild
import com.intellij.database.model.ObjectKind
import com.intellij.database.util.DasUtil
import com.intellij.database.util.ObjectPath
LAYOUT.ignoreDependencies = true
LAYOUT.baseName { ctx -> baseName(ctx.object) }
LAYOUT.fileScope { path -> fileScope(path) }
def baseName(obj) {
def schema = DasUtil.getSchema(obj)
def file = fileName(obj)
if (schema.isEmpty()) {
return file
}
else {
return sanitize(schema) + "/" + obj.kind.code() + "/" + file
}
}
def fileName(obj) {
for (def cur = obj; cur != null; cur = cur.dasParent) {
if (storeSeparately(cur)) return sanitize(cur.name)
}
return sanitize(obj.name)
}
def fileScope(path) {
def root = path.getName(0).toString()
if (root.endsWith(".sql")) return null
return ObjectPath.create(root, ObjectKind.SCHEMA)
}
def storeSeparately(obj) {
return obj instanceof DasObjectWithSource || obj instanceof DasSchemaChild
}
def sanitize(name) {
return name.replace('/', 'slash')
}

View File

@@ -0,0 +1,42 @@
import com.intellij.database.model.DasObjectWithSource
import com.intellij.database.model.DasSchemaChild
import com.intellij.database.model.ObjectKind
import com.intellij.database.util.DasUtil
import com.intellij.database.util.ObjectPath
LAYOUT.ignoreDependencies = true
LAYOUT.baseName { ctx -> baseName(ctx.object) }
LAYOUT.fileScope { path -> fileScope(path) }
def baseName(obj) {
def schema = DasUtil.getSchema(obj)
def file = fileName(obj)
if (schema.isEmpty()) {
return file
}
else {
return sanitize(schema) + "/" + file
}
}
def fileName(obj) {
for (def cur = obj; cur != null; cur = cur.dasParent) {
if (storeSeparately(cur)) return sanitize(cur.name)
}
return sanitize(obj.name)
}
def fileScope(path) {
def root = path.getName(0).toString()
if (root.endsWith(".sql")) return null
return ObjectPath.create(root, ObjectKind.SCHEMA)
}
def storeSeparately(obj) {
return obj instanceof DasObjectWithSource || obj instanceof DasSchemaChild
}
def sanitize(name) {
return name.replace('/', 'slash')
}

View File

@@ -0,0 +1,21 @@
import com.intellij.database.model.DasObjectWithSource
import com.intellij.database.model.DasSchemaChild
LAYOUT.baseName { ctx -> baseName(ctx.object) }
LAYOUT.fileName { ctx -> String.format("%03d-%s.sql", ctx.count, ctx.baseName) }
def baseName(obj) {
for (def cur = obj; cur != null; cur = cur.dasParent) {
if (storeSeparately(cur)) return sanitize(cur.name)
}
return sanitize(obj.name)
}
def storeSeparately(obj) {
return obj instanceof DasObjectWithSource || obj instanceof DasSchemaChild
}
def sanitize(name) {
return name.replace('/', 'slash')
}

View File

@@ -0,0 +1,21 @@
import com.intellij.database.model.DasObjectWithSource
import com.intellij.database.model.DasSchemaChild
LAYOUT.ignoreDependencies = true
LAYOUT.baseName { ctx -> baseName(ctx.object) }
def baseName(obj) {
for (def cur = obj; cur != null; cur = cur.dasParent) {
if (storeSeparately(cur)) return sanitize(cur.name)
}
return sanitize(obj.name)
}
def storeSeparately(obj) {
return obj instanceof DasObjectWithSource || obj instanceof DasSchemaChild
}
def sanitize(name) {
return name.replace('/', 'slash')
}

View File

@@ -0,0 +1,74 @@
import com.intellij.database.model.DasTable
import com.intellij.database.util.Case
import com.intellij.database.util.DasUtil
/*
* Available context bindings:
* SELECTION Iterable<DasObject>
* PROJECT project
* FILES files helper
*/
packageName = "com.sample;"
typeMapping = [
(~/(?i)int/) : "long",
(~/(?i)float|double|decimal|real/): "double",
(~/(?i)datetime|timestamp/) : "java.sql.Timestamp",
(~/(?i)date/) : "java.sql.Date",
(~/(?i)time/) : "java.sql.Time",
(~/(?i)/) : "String"
]
FILES.chooseDirectoryAndSave("Choose directory", "Choose where to store generated files") { dir ->
SELECTION.filter { it instanceof DasTable }.each { generate(it, dir) }
}
def generate(table, dir) {
def className = javaName(table.getName(), true)
def fields = calcFields(table)
new File(dir, className + ".java").withPrintWriter { out -> generate(out, className, fields) }
}
def generate(out, className, fields) {
out.println "package $packageName"
out.println ""
out.println ""
out.println "public class $className {"
out.println ""
fields.each() {
if (it.annos != "") out.println " ${it.annos}"
out.println " private ${it.type} ${it.name};"
}
out.println ""
fields.each() {
out.println ""
out.println " public ${it.type} get${it.name.capitalize()}() {"
out.println " return ${it.name};"
out.println " }"
out.println ""
out.println " public void set${it.name.capitalize()}(${it.type} ${it.name}) {"
out.println " this.${it.name} = ${it.name};"
out.println " }"
out.println ""
}
out.println "}"
}
def calcFields(table) {
DasUtil.getColumns(table).reduce([]) { fields, col ->
def spec = Case.LOWER.apply(col.getDasType().getSpecification())
def typeStr = typeMapping.find { p, t -> p.matcher(spec).find() }.value
fields += [[
name : javaName(col.getName(), false),
type : typeStr,
annos: ""]]
}
}
def javaName(str, capitalize) {
def s = com.intellij.psi.codeStyle.NameUtil.splitNameIntoWords(str)
.collect { Case.LOWER.apply(it).capitalize() }
.join("")
.replaceAll(/[^\p{javaJavaIdentifierPart}[_]]/, "_")
capitalize || s.length() == 1? s : Case.LOWER.apply(s[0]) + s[1..-1]
}

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,14 @@
<?xml version="1.0"?>
<migrationMap>
<name value="JUnit (4.x -&gt; 5.0)" />
<description value="For transferring the JUnit 4 test annotations to the new jupiter ones, may result in red code! Assertions won't be migrated.
Please see the 'Java | JUnit issues | JUnit 4 test can be JUnit 5' inspection to migrate only tests which can be converted fully automatically." />
<entry oldName="org.junit.Before" newName="org.junit.jupiter.api.BeforeEach" type="class"/>
<entry oldName="org.junit.BeforeClass" newName="org.junit.jupiter.api.BeforeAll" type="class"/>
<entry oldName="org.junit.After" newName="org.junit.jupiter.api.AfterEach" type="class"/>
<entry oldName="org.junit.AfterClass" newName="org.junit.jupiter.api.AfterAll" type="class"/>
<entry oldName="org.junit.Test" newName="org.junit.jupiter.api.Test" type="class"/>
<entry oldName="org.junit.Ignore" newName="org.junit.jupiter.api.Disabled" type="class"/>
</migrationMap>

View File

@@ -0,0 +1,5 @@
<application>
<component name="AquaNewUserFeedbackInfoState"><![CDATA[{
"userTypedInEditor": true
}]]></component>
</application>

View File

@@ -0,0 +1,6 @@
<application>
<component name="AquaOldUserFeedbackInfoState"><![CDATA[{
"userTypedInEditor": true,
"firstUsageTime": "2024-05-13T16:19:21.627506"
}]]></component>
</application>

View File

@@ -0,0 +1,3 @@
<application>
<component name="CommonFeedbackSurveyService"><![CDATA[{}]]></component>
</application>

View File

@@ -0,0 +1,3 @@
<application>
<component name="DontShowAgainFeedbackService"><![CDATA[{}]]></component>
</application>

View File

@@ -0,0 +1,3 @@
<application>
<component name="KafkaConsumerProducerInfoState"><![CDATA[{}]]></component>
</application>

View File

@@ -0,0 +1,5 @@
<application>
<component name="NewUIInfoState"><![CDATA[{
"enableNewUIDate": "2024-05-13T18:52:55.125134"
}]]></component>
</application>

View File

@@ -0,0 +1,3 @@
<application>
<component name="PyCharmCEFeedbackState"><![CDATA[{}]]></component>
</application>

View File

@@ -0,0 +1,5 @@
<application>
<component name="PyCharmUIInfoState"><![CDATA[{
"newUserFirstRunDate": "2024-05-13T16:17:29.814255"
}]]></component>
</application>

View File

@@ -0,0 +1,175 @@
<application>
<component name="ActionsLocalSummary">
<e n="$SelectAll">
<i c="363" l="1717671166927" />
</e>
<e n="$Undo">
<i c="152" l="1717669152300" />
</e>
<e n="EditorBackSpace">
<i c="954" l="1724138760223" />
</e>
<e n="EditorChooseLookupItem">
<i c="144" l="1717669304916" />
</e>
<e n="EditorCopy">
<i c="23" l="1724138534223" />
</e>
<e n="EditorCut">
<i c="12" l="1724138649421" />
</e>
<e n="EditorDown">
<i c="189" l="1724138650560" />
</e>
<e n="EditorDuplicate">
<i c="1" l="1715845001776" />
</e>
<e n="EditorEnter">
<i c="307" l="1724138762140" />
</e>
<e n="EditorEscape">
<i c="338" l="1717669085666" />
</e>
<e n="EditorLeft">
<i c="160" l="1724138761876" />
</e>
<e n="EditorLeftWithSelection">
<i c="7" l="1717414253892" />
</e>
<e n="EditorLineEnd">
<i c="20" l="1717664908701" />
</e>
<e n="EditorLineStart">
<i c="11" l="1724138635627" />
</e>
<e n="EditorNextWord">
<i c="1" l="1716886114968" />
</e>
<e n="EditorPaste">
<i c="19" l="1724138651338" />
</e>
<e n="EditorPreviousWord">
<i c="5" l="1717126187648" />
</e>
<e n="EditorRight">
<i c="190" l="1717664408909" />
</e>
<e n="EditorRightWithSelection">
<i c="1" l="1716895022454" />
</e>
<e n="EditorStartNewLine">
<i c="1" l="1716965190178" />
</e>
<e n="EditorTab">
<i c="23" l="1724138596529" />
</e>
<e n="EditorUp">
<i c="197" l="1724138651101" />
</e>
<e n="Find">
<i c="3" l="1717658357202" />
</e>
<e n="GotoDeclaration">
<i c="280" l="1717668194936" />
</e>
<e n="GotoLine">
<i c="3" l="1717402779921" />
</e>
<e n="HippieCompletion">
<i c="3" l="1717395097460" />
</e>
<e n="Kotlin.NewFile">
<i c="2" l="1716864639359" />
</e>
<e n="NewFile">
<i c="2" l="1716526653063" />
</e>
<e n="NewTypeScriptFile">
<i c="1" l="1716531088417" />
</e>
<e n="NextTemplateVariable">
<i c="11" l="1717667201250" />
</e>
<e n="PsiViewer">
<i c="5" l="1724138560134" />
</e>
<e n="PsiViewerForContext">
<i c="119" l="1717669183815" />
</e>
<e n="RedesignedRunConfigurationSelector">
<i c="17" l="1715931525531" />
</e>
<e n="ReformatCode">
<i c="403" l="1717664943428" />
</e>
<e n="RenameElement">
<i c="7" l="1716531107003" />
</e>
<e n="ReplaceInPath">
<i c="1" l="1715750491757" />
</e>
<e n="Run">
<i c="3" l="1715858915740" />
</e>
<e n="RunClass">
<i c="6" l="1715931523440" />
</e>
<e n="SelectInProjectView">
<i c="1" l="1715593582035" />
</e>
<e n="SettingsEntryPoint">
<i c="3" l="1717144723281" />
</e>
<e n="Stop">
<i c="1" l="1715931533927" />
</e>
<e n="WelcomeScreen.CreateNewProject">
<i c="1" l="1724138505008" />
</e>
<e n="WelcomeScreen.OpenProject">
<i c="1" l="1715588344107" />
</e>
<e n="com.intellij.codeInsight.daemon.NavigateAction">
<i c="16" l="1715854404250" />
</e>
<e n="com.intellij.dev.psiViewer.stubs.StubDetailsViewer$1">
<i c="1" l="1716531427973" />
</e>
<e n="com.intellij.execution.lineMarker.LineMarkerActionWrapper">
<i c="7" l="1717664194640" />
</e>
<e n="com.intellij.find.SearchReplaceComponent$CloseAction">
<i c="3" l="1717658365924" />
</e>
<e n="com.intellij.ide.plugins.newui.PluginsTab$3$1">
<i c="1" l="1716526709254" />
</e>
<e n="com.intellij.notification.NotificationAction$Simple">
<i c="28" l="1717396848995" />
</e>
<e n="com.intellij.openapi.fileEditor.impl.tabActions.CloseTab">
<i c="32" l="1717658371894" />
</e>
<e n="com.intellij.openapi.ui.impl.DialogWrapperPeerImpl$AnCancelAction">
<i c="42" l="1717406812948" />
</e>
<e n="com.intellij.openapi.wm.impl.SquareAnActionButton">
<i c="4" l="1717396850425" />
</e>
<e n="com.intellij.platform.lsp.api.lsWidget.RestartLspServerAction">
<i c="1" l="1717661339218" />
</e>
<e n="com.intellij.toolWindow.ToolWindowHeader$HideAction">
<i c="1" l="1717394781740" />
</e>
<e n="com.intellij.ui.CommonActionsPanel$AddButton">
<i c="1" l="1715836652419" />
</e>
<e n="com.intellij.ui.CommonActionsPanel$RemoveButton">
<i c="11" l="1715931520232" />
</e>
<e n="editRunConfigurations">
<i c="13" l="1715931526161" />
</e>
</component>
</application>

View File

@@ -0,0 +1,5 @@
<application>
<component name="EditorColorsManagerImpl">
<global_color_scheme name="Dark" />
</component>
</application>

View File

@@ -0,0 +1,5 @@
<application>
<component name="ConsoleFont">
<option name="VERSION" value="1" />
</component>
</application>

View File

@@ -0,0 +1,3 @@
<application>
<component name="LocalDatabaseDriverManager" version="201" />
</application>

View File

@@ -0,0 +1,103 @@
<application>
<component name="DebuggerSettings">
<filter>
<option name="PATTERN" value="com.sun.*" />
<option name="ENABLED" value="true" />
<option name="INCLUDE" value="true" />
</filter>
<filter>
<option name="PATTERN" value="java.*" />
<option name="ENABLED" value="true" />
<option name="INCLUDE" value="true" />
</filter>
<filter>
<option name="PATTERN" value="javax.*" />
<option name="ENABLED" value="true" />
<option name="INCLUDE" value="true" />
</filter>
<filter>
<option name="PATTERN" value="org.omg.*" />
<option name="ENABLED" value="true" />
<option name="INCLUDE" value="true" />
</filter>
<filter>
<option name="PATTERN" value="sun.*" />
<option name="ENABLED" value="true" />
<option name="INCLUDE" value="true" />
</filter>
<filter>
<option name="PATTERN" value="jdk.internal.*" />
<option name="ENABLED" value="true" />
<option name="INCLUDE" value="true" />
</filter>
<filter>
<option name="PATTERN" value="junit.*" />
<option name="ENABLED" value="true" />
<option name="INCLUDE" value="true" />
</filter>
<filter>
<option name="PATTERN" value="org.junit.*" />
<option name="ENABLED" value="true" />
<option name="INCLUDE" value="true" />
</filter>
<filter>
<option name="PATTERN" value="com.intellij.rt.*" />
<option name="ENABLED" value="true" />
<option name="INCLUDE" value="true" />
</filter>
<filter>
<option name="PATTERN" value="com.yourkit.runtime.*" />
<option name="ENABLED" value="true" />
<option name="INCLUDE" value="true" />
</filter>
<filter>
<option name="PATTERN" value="com.springsource.loaded.*" />
<option name="ENABLED" value="true" />
<option name="INCLUDE" value="true" />
</filter>
<filter>
<option name="PATTERN" value="org.springsource.loaded.*" />
<option name="ENABLED" value="true" />
<option name="INCLUDE" value="true" />
</filter>
<filter>
<option name="PATTERN" value="javassist.*" />
<option name="ENABLED" value="true" />
<option name="INCLUDE" value="true" />
</filter>
<filter>
<option name="PATTERN" value="org.apache.webbeans.*" />
<option name="ENABLED" value="true" />
<option name="INCLUDE" value="true" />
</filter>
<filter>
<option name="PATTERN" value="com.ibm.ws.*" />
<option name="ENABLED" value="true" />
<option name="INCLUDE" value="true" />
</filter>
<filter>
<option name="PATTERN" value="org.mockito.*" />
<option name="ENABLED" value="true" />
<option name="INCLUDE" value="true" />
</filter>
<filter>
<option name="PATTERN" value="kotlin.*" />
<option name="ENABLED" value="true" />
<option name="INCLUDE" value="true" />
</filter>
<filter>
<option name="PATTERN" value="androidx.compose.runtime.*" />
<option name="ENABLED" value="true" />
<option name="INCLUDE" value="true" />
</filter>
<filter>
<option name="PATTERN" value="kotlinx.*" />
<option name="ENABLED" value="true" />
<option name="INCLUDE" value="true" />
</filter>
</component>
<component name="XDebuggerSettings">
<data-views />
<general />
</component>
</application>

View File

@@ -0,0 +1,5 @@
<application>
<component name="DefaultFont">
<option name="VERSION" value="1" />
</component>
</application>

View File

@@ -0,0 +1,8 @@
<application>
<component name="CodeInsightSettings">
<option name="AUTO_POPUP_JAVADOC_INFO" value="true" />
</component>
<component name="CodeVisionSettings">
<option name="defaultPosition" value="Right" />
</component>
</application>

View File

@@ -0,0 +1,152 @@
<application>
<component name="FeatureUsageStatistics" first-run="1715588381754" have-been-shown="false" show-in-other="true" show-in-compilation="true">
<feature id="editing.completion.camelHumps" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="editing.completion.smarttype.afternew" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="editing.completion.second.smarttype.aslist" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="codeassists.surroundwith.statement" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="navigation.goto.file.line" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="editing.completion.finishBySmartEnter" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="navigation.popup.symbol" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="switcher" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="editing.completion.replace" count="0" last-shown="1717669304444" last-used="0" shown-count="527" />
<feature id="codeassists.complete.statement" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="vcs.show.quick.list" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="spring.endpoints.tool.window" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="editing.completion.smarttype.casting" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="spring.inject.entities" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="editing.convert.line.separators" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="db.console.execute" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="navigation.recent.files" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="scratch" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="refactoring.move.moveInner" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="vcs.pull.requests" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="vcs.annotate" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="ui.open.last.tool.window" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="editing.reformat.code" count="403" last-shown="0" last-used="1717664943430" shown-count="0" />
<feature id="editing.completion.show.liveTemplates" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="editing.copy.line" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="navigation.find.in.files" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="editing.completion.finishByExclamation" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="db.copy.table" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="ui.hide.tool.window" count="1" last-shown="0" last-used="1717394781747" shown-count="0" />
<feature id="navigation.find.replace.in.files.toggle" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="move.element.left.right" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="jar.diff" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="intentions.check.regexp" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="profiler.open.snapshot" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="codeassists.comment.line" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="editing.completion.second.smarttype.chain" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="editing.completion.second.smarttype.toar" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="SearchEverywhere" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="editor.delete.line" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="navigation.inheritance.hierarchy" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="editing.duplicate" count="1" last-shown="0" last-used="1715845001813" shown-count="0" />
<feature id="editing.copy.reference" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="codeassists.highlight.throws" count="3" last-shown="0" last-used="1716888368650" shown-count="0" />
<feature id="navigation.find" count="3" last-shown="0" last-used="1717658357261" shown-count="0" />
<feature id="codeassists.quickdefinition" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="editing.completion.basic" count="144" last-shown="0" last-used="1717669304926" shown-count="0" />
<feature id="editing.completion.postfix" count="1" last-shown="0" last-used="1716864722813" shown-count="0" />
<feature id="dir.diff" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="navigation.recent.locations" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="diagram.show.diff" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="editing.select.word" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="ui.close.other.editors" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="debugger.evaluate.expression" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="codeassists.highlight.usages" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="codeassists.highlight.implements" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="debugger.breakpoint.edit" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="editing.completion.smarttype.general" count="0" last-shown="1716866236054" last-used="0" shown-count="4" />
<feature id="codeassist.inspect.batch" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="db.table.editor" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="codeassists.liveTemplates" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="navigation.goto.usages" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="codeassists.comment.block" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="intentions.edit.regexp" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="codeassists.quickdefinition.lookup" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="navigation.find.usages" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="spring.endpoint.actions" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="editing.clipboard.history" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="editing.compare.editor.with.clipboard" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="refactoring.rename" count="7" last-shown="0" last-used="1716531107123" shown-count="0" />
<feature id="navigation.popup.action" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="refactoring.show.quick.list" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="db.forget.cached.schemas" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="editing.completion.cancelByControlArrows" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="find.recent.search" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="navigation.goto.inspection" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="vcs.show.local.history" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="editing.completion.variable.name" count="2" last-shown="0" last-used="1716866234490" shown-count="0" />
<feature id="vcs.use.integration" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="navigation.popup.file" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="codeassists.overrideimplement" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="db.console.run.intention" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="db.diff" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="ui.close.all.editors" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="navigation.popup.wildcards" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="refactoring.introduceVariable" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="refactoring.extractMethod" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="codeassists.javadoc.external" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="codeassists.surroundwith.expression" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="codeassists.generate.code" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="navigation.goto.declaration" count="281" last-shown="0" last-used="1717668194942" shown-count="0" />
<feature id="editing.completion.finishByDotEtc" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="ui.open.project.tool.window" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="editing.join.lines" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="navigation.goto.implementation" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="debugger.breakpoint.non.suspending" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="editing.completion.finishByCtrlDot" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="codeassists.context.actions" count="1" last-shown="0" last-used="1716952942937" shown-count="0" />
<feature id="navigation.select.in" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="editing.completion.global.member.name" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="intentions.fix.javadoc" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="ui.tree.speedsearch" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="ui.horizontal.scrolling" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="navigation.replace" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="refactoring.copyClass" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="spring.find.endpoint" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="codeassists.highlight.return" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="ant.quickfix.CreateProperty" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="navigation.popup.camelprefix" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="navigation.popup.class" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="codeassists.parameterInfo" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="db.table.editor.wrapper" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="find.completion" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="tag.name.completion" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="editing.completion.second.smarttype.array.member" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="diagram.show.popup" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="refactoring.introduceVariable.incompleteStatement" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="db.readonly.datasource" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="vcs.compare.file.versions" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="navigation.find.replace.toggle" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="editing.add.carets.using.double.ctrl" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="db.console" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="codeassists.quickjavadoc.lookup" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="ui.scheme.quickswitch" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="navigation.replace.in.files" count="1" last-shown="0" last-used="1715750492074" shown-count="0" />
<feature id="navigation.popup.file.structure" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="ant.quickfix.CreateTarget" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="codeassists.quickjavadoc.ctrln" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="codeassists.quickjavadoc" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="ui.recentchanges" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="diagram.show" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="editing.move.statement.up.down" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="editing.completion.second.basic" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="editing.completion.changeSorting" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="db.assign.color" count="0" last-shown="0" last-used="0" shown-count="0" />
<feature id="spring.select.in" count="0" last-shown="0" last-used="0" shown-count="0" />
<completionStatsTag>
<option name="sparedCharacters" value="687" />
<option name="invocations" value="89" />
<option name="startDate" value="1715529600000" />
<option name="dayCount" value="11" />
<option name="lastDate" value="1717603200000" />
</completionStatsTag>
<fixesStatsTag>
<option name="invocations" value="1" />
<option name="startDate" value="1717344000000" />
<option name="dayCount" value="1" />
<option name="lastDate" value="1717344000000" />
</fixesStatsTag>
</component>
</application>

View File

@@ -0,0 +1,8 @@
<application>
<component name="FileTypeManager" version="18">
<extensionMap>
<removed_mapping ext="apk" approved="true" type="ARCHIVE" />
<removed_mapping ext="psd" approved="true" type="Image" />
</extensionMap>
</component>
</application>

View File

@@ -0,0 +1,10 @@
<application>
<component name="FindSettings">
<mask>*.css</mask>
<mask>*.html</mask>
<mask>*.xml</mask>
<mask>*.jsp</mask>
<mask>*.properties</mask>
<mask>*.java</mask>
</component>
</application>

View File

@@ -0,0 +1,9 @@
<application>
<component name="LessonStateBase">
<option name="map">
<map>
<entry key="java.onboarding" value="NOT_PASSED" />
</map>
</option>
</component>
</application>

View File

@@ -0,0 +1,5 @@
<application>
<component name="GeneralLocalSettings">
<option name="defaultProjectDirectory" />
</component>
</application>

View File

@@ -0,0 +1,8 @@
<application>
<component name="GeneralSettings">
<option name="showTipsOnStartup" value="false" />
</component>
<component name="Registry">
<entry key="ide.experimental.ui" value="true" />
</component>
</application>

View File

@@ -0,0 +1,9 @@
<application>
<component name="IgnoredPluginSuggestions">
<option name="pluginIds">
<list>
<option value="Docker" />
</list>
</option>
</component>
</application>

View File

@@ -0,0 +1,187 @@
<application>
<component name="ProjectJdkTable">
<jdk version="2">
<name value="22" />
<type value="JavaSDK" />
<version value="java version &quot;22.0.1&quot;" />
<homePath value="/Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home" />
<roots>
<annotationsPath>
<root type="composite">
<root url="jar://$APPLICATION_HOME_DIR$/plugins/java/lib/resources/jdkAnnotations.jar!/" type="simple" />
</root>
</annotationsPath>
<classPath>
<root type="composite">
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/com.oracle.graal.graal_enterprise" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/com.oracle.svm.enterprise.truffle" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/com.oracle.svm.extraimage_enterprise" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/java.base" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/java.compiler" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/java.datatransfer" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/java.desktop" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/java.instrument" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/java.logging" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/java.management" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/java.management.rmi" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/java.naming" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/java.net.http" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/java.prefs" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/java.rmi" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/java.scripting" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/java.se" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/java.security.jgss" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/java.security.sasl" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/java.smartcardio" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/java.sql" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/java.sql.rowset" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/java.transaction.xa" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/java.xml" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/java.xml.crypto" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/jdk.accessibility" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/jdk.attach" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/jdk.charsets" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/jdk.compiler" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/jdk.crypto.cryptoki" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/jdk.crypto.ec" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/jdk.dynalink" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/jdk.editpad" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/jdk.graal.compiler" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/jdk.graal.compiler.management" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/jdk.hotspot.agent" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/jdk.httpserver" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/jdk.incubator.vector" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/jdk.internal.ed" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/jdk.internal.jvmstat" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/jdk.internal.le" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/jdk.internal.opt" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/jdk.internal.vm.ci" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/jdk.jartool" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/jdk.javadoc" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/jdk.jcmd" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/jdk.jconsole" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/jdk.jdeps" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/jdk.jdi" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/jdk.jdwp.agent" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/jdk.jfr" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/jdk.jlink" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/jdk.jpackage" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/jdk.jshell" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/jdk.jsobject" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/jdk.jstatd" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/jdk.localedata" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/jdk.management" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/jdk.management.agent" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/jdk.management.jfr" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/jdk.naming.dns" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/jdk.naming.rmi" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/jdk.net" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/jdk.nio.mapmode" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/jdk.random" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/jdk.sctp" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/jdk.security.auth" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/jdk.security.jgss" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/jdk.unsupported" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/jdk.unsupported.desktop" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/jdk.xml.dom" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/jdk.zipfs" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/org.graalvm.collections" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/org.graalvm.extraimage.builder" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/org.graalvm.extraimage.librarysupport" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/org.graalvm.nativeimage" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/org.graalvm.nativeimage.llvm" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/org.graalvm.truffle.compiler" type="simple" />
<root url="jrt:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home!/org.graalvm.word" type="simple" />
</root>
</classPath>
<javadocPath>
<root type="composite" />
</javadocPath>
<sourcePath>
<root type="composite">
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/java.se" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/jdk.jdi" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/jdk.jfr" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/jdk.net" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/java.rmi" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/java.sql" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/java.xml" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/jdk.jcmd" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/jdk.sctp" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/java.base" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/jdk.jdeps" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/jdk.jlink" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/jdk.zipfs" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/java.prefs" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/jdk.attach" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/jdk.jshell" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/jdk.jstatd" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/jdk.random" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/java.naming" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/jdk.editpad" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/jdk.jartool" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/jdk.javadoc" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/jdk.xml.dom" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/java.desktop" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/java.logging" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/jdk.charsets" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/jdk.compiler" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/jdk.dynalink" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/jdk.jconsole" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/jdk.jpackage" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/jdk.jsobject" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/java.compiler" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/java.net.http" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/jdk.crypto.ec" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/java.scripting" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/jdk.httpserver" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/jdk.jdwp.agent" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/jdk.localedata" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/jdk.management" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/jdk.naming.dns" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/jdk.naming.rmi" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/java.instrument" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/java.management" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/java.sql.rowset" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/java.xml.crypto" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/jdk.internal.ed" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/jdk.internal.le" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/jdk.nio.mapmode" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/jdk.unsupported" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/java.smartcardio" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/jdk.internal.opt" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/org.graalvm.word" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/java.datatransfer" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/jdk.accessibility" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/jdk.hotspot.agent" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/jdk.security.auth" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/jdk.security.jgss" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/java.security.jgss" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/java.security.sasl" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/jdk.graal.compiler" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/jdk.internal.vm.ci" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/jdk.management.jfr" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/java.management.rmi" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/java.transaction.xa" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/jdk.crypto.cryptoki" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/jdk.incubator.vector" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/jdk.internal.jvmstat" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/jdk.management.agent" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/jdk.unsupported.desktop" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/org.graalvm.collections" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/org.graalvm.nativeimage" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/org.graalvm.nativeimage.llvm" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/org.graalvm.truffle.compiler" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/jdk.graal.compiler.management" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/org.graalvm.extraimage.builder" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/com.oracle.graal.graal_enterprise" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/com.oracle.svm.enterprise.truffle" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/com.oracle.svm.extraimage_enterprise" type="simple" />
<root url="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/org.graalvm.extraimage.librarysupport" type="simple" />
</root>
</sourcePath>
</roots>
<additional />
</jdk>
</component>
</application>

View File

@@ -0,0 +1,5 @@
<application>
<component name="K2NewUserTracker">
<option name="lastSavedPluginMode" value="K1" />
</component>
</application>

View File

@@ -0,0 +1,3 @@
<application>
<component name="Logs.Categories"><![CDATA[{}]]></component>
</application>

View File

@@ -0,0 +1,66 @@
<application>
<component name="FileEditorProviderManager">{}</component>
<component name="NotRoamableUiSettings">
<option name="fontSize" value="13.0" />
<option name="presentationModeIdeScale" value="1.75" />
<option name="overrideLafFontsWasMigrated" value="true" />
</component>
<component name="PropertyService"><![CDATA[{
"keyToString": {
"CWM_LOGGING_VERSION": "1",
"InstalledPluginsSearchHistory": "remote\nre\ntypescr\ntypesc\ntypes",
"LANGUAGE_DETECTOR_ASKED_BEFORE": "true",
"LAST_CALCULATED_COLOR_INDEX_KEY": "2",
"MarketplacePluginsSearchHistory": "typesc\ntype",
"NextRunPlatformUpdateBuild": "IC-232.10300.40",
"NextRunPlatformUpdateVersion": "2023.2.6",
"NonModalCommitCustomization.IsApplied": "true",
"PluginConfigurable.selectionTab": "1",
"RunOnceActivity.ide.auto-popup.quick-doc.initialized": "true",
"RunOnceActivity.java.code.vision.default.position.was.set": "true",
"SettingsSearchHistory": "code st",
"StubDetailsViewer.showPreviewDetails": "true",
"ask.about.ctrl.y.shortcut.v2": "true",
"bundled.plugins.list.saved.version": "IC-232.10227.8",
"com.intellij.ide.projectWizard.generators.JavaNewProjectWizard$Step.selectedStep": "IntelliJ",
"enter_selection_count": "5",
"evlsprt3.232": "5",
"evlsprt3.241": "3",
"experimental.ui.on.first.startup": "true",
"experimental.ui.used.version": "241.19072.14",
"file.gist.reindex.count": "4",
"fileTypeChangedCounter": "6",
"fontSizeToResetConsole": "13.0",
"fontSizeToResetEditor": "13.0",
"got.it.tooltip.empty.project.create.file": "1",
"got.it.tooltip.reader.mode.got.it": "1",
"gotit.previous.run": "IC-232.10227.8",
"ide.memory.adjusted": "true",
"ift.hide.welcome.screen.promo": "true",
"installed.kotlin.plugin.version": "241.19072.14-IJ",
"jdk.selected.JAVA_MODULE": "22",
"llm.installer.last.toolwindow.state": "LLM_INSTALLER",
"migrated.non.roamable.values.from.general.settings": "true",
"previousColorScheme": "_@user_Dark",
"project.wizard.group": "NPW.empty-project",
"registry.to.advanced.settings.migration.build": "IU-241.19072.14",
"tasks.pass.word.conversion.enforced": "true",
"ts.lib.d.ts.version": "5.4.3"
},
"keyToStringList": {
"fileTypeDetectors": [
"com.intellij.ide.scratch.ScratchFileServiceImpl$Detector",
"com.intellij.profiler.ultimate.hprof.impl.HprofFileTypeDetector",
"com.intellij.javascript.debugger.sourcemap.SourceMapFileType$MyFileTypeDetector",
"com.intellij.database.vfs.DbStorageFileType$Detector",
"com.jetbrains.nodejs.util.NodeFileTypeDetector$JavaScriptFileTypeDetector",
"com.jetbrains.nodejs.util.NodeFileTypeDetector$TypeScriptFileTypeDetector",
"org.jetbrains.plugins.textmate.TextMateFileType$TextMateFileDetector"
]
}
}]]></component>
<component name="PsiViewerSettings">
<option name="type" value="Slint File file" />
<option name="lastSelectedTabIndex" value="2" />
</component>
</application>

View File

@@ -0,0 +1,5 @@
<application>
<component name="PathMacrosImpl">
<macro name="MAVEN_REPOSITORY" value="/Users/me/.m2/repository" />
</component>
</application>

View File

@@ -0,0 +1,19 @@
<application>
<component name="ProfilerRunConfigurations">
<profilerRunConfigurations>
<item configurationTypeId="IntellijProfilerConfiguration">
<IntellijProfilerConfigurationState name="IntelliJ Profiler" />
</item>
</profilerRunConfigurations>
<knownConfigurationTypes>
<id>IntellijProfilerConfiguration</id>
<id>AsyncProfilerCPUConfiguration</id>
<id>AsyncProfilerMemoryConfiguration</id>
<id>AsyncProfilerConfiguration</id>
<id>JFRSimpleConfiguration</id>
</knownConfigurationTypes>
<migrationStatus>
<status languageGroup="Java Profiler Configuration Type" lastMigrationIndex="3" />
</migrationStatus>
</component>
</application>

View File

@@ -0,0 +1,26 @@
<application>
<component name="RecentProjectsManager">
<option name="additionalInfo">
<map>
<entry key="$USER_HOME$/Desktop/Dev/垃圾桶/intellij-test/intellij-test">
<value>
<RecentProjectMetaInfo frameTitle="intellij-test" projectWorkspaceId="2kuflqIPMJwd5b2B6quHLOGo2oW">
<option name="activationTimestamp" value="1724142610913" />
<option name="binFolder" value="$APPLICATION_HOME_DIR$/bin" />
<option name="build" value="IU-241.19072.14" />
<option name="buildTimestamp" value="1723129440000" />
<option name="colorInfo">
<RecentProjectColorInfo associatedIndex="2" />
</option>
<frame x="260" y="45" width="1400" height="962" />
<option name="productionCode" value="IU" />
<option name="projectOpenTimestamp" value="1724138536626" />
</RecentProjectMetaInfo>
</value>
</entry>
</map>
</option>
<option name="lastOpenedProject" value="$USER_HOME$/Desktop/Dev/垃圾桶/intellij-test/intellij-test" />
<option name="lastProjectLocation" value="$USER_HOME$/Desktop/Dev/垃圾桶/intellij-test" />
</component>
</application>

View File

@@ -0,0 +1,13 @@
<application>
<component name="RunnerLayoutSettings">
<runner id="JavaRunner">
<ViewImpl>
<option name="ID" value="ConsoleContent" />
<option name="placeInGrid" value="bottom" />
</ViewImpl>
<TabImpl>
<option name="bottomProportion" value="0.0" />
</TabImpl>
</runner>
</component>
</application>

View File

@@ -0,0 +1,5 @@
<application>
<component name="SettingsSyncSettings">
<option name="migrationFromOldStorageChecked" value="true" />
</component>
</application>

View File

@@ -0,0 +1,10 @@
<application>
<component name="Trusted.Paths">
<option name="TRUSTED_PROJECT_PATHS">
<map>
<entry key="$USER_HOME$/Desktop/Dev/垃圾桶/intellij-test/intellij-test" value="true" />
<entry key="$USER_HOME$/IdeaProjects/untitled" value="true" />
</map>
</option>
</component>
</application>

View File

@@ -0,0 +1,5 @@
<application>
<component name="UISettings">
<option name="UI_DENSITY" value="COMPACT" />
</component>
</application>

View File

@@ -0,0 +1,9 @@
<application>
<component name="UpdatesConfigurable">
<option name="CHECK_NEEDED" value="false" />
<option name="LAST_BUILD_CHECKED" value="IU-241.19072.14" />
<option name="LAST_TIME_CHECKED" value="1724138771909" />
<option name="OBSOLETE_CUSTOM_REPOSITORIES_CLEAN_NEEDED" value="false" />
<option name="WHATS_NEW_SHOWN_FOR" value="241" />
</component>
</application>

View File

@@ -0,0 +1,3 @@
<application>
<component name="UsagesStatistic" show-notification="false" />
</application>

View File

@@ -0,0 +1,5 @@
<application>
<component name="VcsApplicationSettings">
<option name="COMMIT_FROM_LOCAL_CHANGES" value="true" />
</component>
</application>

View File

@@ -0,0 +1,28 @@
<application>
<component name="DimensionService">
<size key="#com.intellij.internal.psiView.PsiViewerDialog.0.0.3840.2160@192dpi" width="1600" height="1200" />
<size key="GridCell.Tab.0.left.0.0.3840.2160@192dpi" width="2668" height="584" />
<size key="GridCell.Tab.0.center.0.0.3840.2160@192dpi" width="2668" height="584" />
<size key="GridCell.Tab.0.right.0.0.3840.2160@192dpi" width="2668" height="584" />
<size key="GridCell.Tab.0.bottom.0.0.3840.2160@192dpi" width="2668" height="584" />
</component>
<component name="WindowManager">
<frame x="260" y="45" width="1400" height="962" />
</component>
<component name="WindowStateApplicationService">
<state x="548" y="251" key="IDE.errors.dialog" timestamp="1717037495400">
<screen x="0" y="25" width="1920" height="982" />
</state>
<state x="548" y="251" key="IDE.errors.dialog/0.25.1920.982/1920.25.1920.1055" timestamp="1717037495400" />
<state x="960" y="469" width="800" height="664" key="WELCOME_SCREEN" timestamp="1724145075550">
<screen x="0" y="25" width="1920" height="1002" />
</state>
<state x="960" y="469" width="800" height="664" key="WELCOME_SCREEN/0.25.1920.1002/1920.25.1920.1055" timestamp="1724145075550" />
<state x="960" y="492" width="800" height="699" key="WELCOME_SCREEN/0.25.1920.1055/1920.25.1920.982" timestamp="1717406858910" />
<state x="960" y="460" width="800" height="650" key="WELCOME_SCREEN/0.25.1920.982/1920.25.1920.1055" timestamp="1717671613288" />
<state x="560" y="132" width="800" height="674" key="new project wizard" timestamp="1724138535837">
<screen x="0" y="25" width="1920" height="1002" />
</state>
<state x="560" y="132" width="800" height="674" key="new project wizard/0.25.1920.1002/1920.25.1920.1055" timestamp="1724138535837" />
</component>
</application>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,251 @@
<project version="4">
<component name="BookmarksManager">
<option name="groups">
<GroupState>
<option name="name" value="untitled" />
</GroupState>
</option>
</component>
<component name="FileEditorManager">
<leaf ideFingerprint="2vb9ntiinehzr" SIDE_TABS_SIZE_LIMIT_KEY="-1">
<file>
<entry file="file://$PROJECT_DIR$/src/Button.slint">
<provider editor-type-id="text-editor" selected="true">
<state relative-caret-position="66">
<caret line="3" column="36" selection-end-line="18" selection-end-column="35" />
</state>
</provider>
</entry>
</file>
<file current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/builtins.slint">
<provider editor-type-id="text-editor" selected="true">
<state relative-caret-position="298">
<caret line="161" column="17" selection-start-line="161" selection-start-column="17" selection-end-line="161" selection-end-column="17" />
</state>
</provider>
</entry>
</file>
</leaf>
</component>
<component name="FileTypeUsageLocalSummary"><![CDATA[{
"data": {
"JAVA": {
"usageCount": 13,
"lastUsed": 1717655844299
},
"Slint File": {
"usageCount": 63,
"lastUsed": 1717667161683
},
"WebPreview": {
"usageCount": 1,
"lastUsed": 1717388498830
}
}
}]]></component>
<component name="FindInProjectRecents">
<findStrings>
<find>StandardListViewItem</find>
</findStrings>
<replaceStrings>
<replace />
</replaceStrings>
</component>
<component name="IdeDocumentHistory">
<changedPaths>
<option value="$PROJECT_DIR$/src/Abc.kt" />
<option value="$PROJECT_DIR$/src/name.js" />
<option value="$PROJECT_DIR$/src/name1.ts" />
<option value="$PROJECT_DIR$/src/name.ts" />
<option value="$PROJECT_DIR$/src/Main.kt" />
<option value="$PROJECT_DIR$/src/Main.java" />
<option value="$PROJECT_DIR$/src/main.slint" />
<option value="$PROJECT_DIR$/src/builtins.slint" />
<option value="$PROJECT_DIR$/src/Button.slint" />
</changedPaths>
</component>
<component name="LanguageUsageStatistics">
<language id="JAVA">
<summary usageCount="97" lastUsage="1717655844299" />
</language>
<language id="JavaScript">
<summary usageCount="1" lastUsage="1716530622897" />
</language>
<language id="Slint">
<summary usageCount="262" lastUsage="1717667161683" />
</language>
<language id="TypeScript">
<summary usageCount="3" lastUsage="1716546261002" />
</language>
<language id="kotlin">
<summary usageCount="2" lastUsage="1716864647147" />
</language>
<language id="textmate">
<summary usageCount="64" lastUsage="1717126069813" />
</language>
</component>
<component name="ProjectView">
<navigator currentView="ProjectPane" proportions="" version="1" />
<panes>
<pane id="PackagesPane" />
<pane id="ProjectPane">
<subPane>
<expand>
<path>
<item name="untitled" type="b2602c69:ProjectViewProjectNode" />
<item name="dir{file:///Users/me/IdeaProjects/untitled}" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="untitled" type="b2602c69:ProjectViewProjectNode" />
<item name="dir{file:///Users/me/IdeaProjects/untitled}" type="462c0819:PsiDirectoryNode" />
<item name="dir{file:///Users/me/IdeaProjects/untitled/src}" type="462c0819:PsiDirectoryNode" />
</path>
</expand>
<select />
</subPane>
</pane>
<pane id="Scope" />
</panes>
</component>
<component name="RunConfigurationStartHistory">
<history>
<element setting="Slint viewer.Button.slint" />
<element setting="Slint viewer.main.slint" />
<element setting="Slint viewer.Unnamed (1)" />
<element setting="Slint viewer.Unnamed" />
</history>
</component>
<component name="TimeTrackingManager">
<option name="totallyTimeSpent" value="27456000" />
</component>
<component name="ToolWindowManager">
<layoutV2>
<window_info active="true" content_ui="combo" id="Project" order="0" visible="true" weight="0.22749999" />
<window_info id="Commit" order="1" weight="0.25" />
<window_info id="Structure" order="2" side_tool="true" weight="0.25" />
<window_info anchor="bottom" id="Version Control" order="0" />
<window_info anchor="bottom" id="Problems" order="1" />
<window_info anchor="bottom" id="Problems View" order="2" />
<window_info anchor="bottom" id="Terminal" order="3" />
<window_info anchor="bottom" id="Run" order="4" weight="0.33044806" />
<window_info anchor="bottom" id="Services" order="5" />
<window_info anchor="right" id="Notifications" order="0" weight="0.33035713" />
<window_info anchor="right" id="AIAssistant" order="1" weight="0.33035713" />
<window_info anchor="right" id="Database" order="2" weight="0.25" />
<window_info anchor="right" id="Gradle" order="3" weight="0.25" />
<window_info anchor="right" id="Maven" order="4" weight="0.25" />
<unified_weights bottom="0.33044806" left="0.22749999" right="0.33035713" />
</layoutV2>
<recentWindows>
<value>Project</value>
<value>Notifications</value>
<value>Run</value>
<value>AIAssistant</value>
</recentWindows>
</component>
<component name="WindowStateProjectService">
<state x="560" y="201" key="#com.intellij.execution.impl.EditConfigurationsDialog" timestamp="1715931531348">
<screen x="0" y="25" width="1920" height="982" />
</state>
<state x="560" y="214" key="#com.intellij.execution.impl.EditConfigurationsDialog/0.25.1920.1055/1920.25.1920.982@0.25.1920.1055" timestamp="1715848676881" />
<state x="560" y="201" key="#com.intellij.execution.impl.EditConfigurationsDialog/0.25.1920.982/1920.25.1920.1055@0.25.1920.982" timestamp="1715931531348" />
<state x="588" y="313" width="1332" height="605" key="#com.intellij.internal.psiView.PsiViewerDialog" timestamp="1717671610308">
<screen x="0" y="25" width="1920" height="982" />
</state>
<state x="531" y="25" key="#com.intellij.internal.psiView.PsiViewerDialog/0.25.1920.1055/1920.25.1920.982@0.25.1920.1055" timestamp="1717406812993" />
<state x="588" y="313" width="1332" height="605" key="#com.intellij.internal.psiView.PsiViewerDialog/0.25.1920.982/1920.25.1920.1055@0.25.1920.982" timestamp="1717671610308" />
<state width="1334" height="292" key="GridCell.Tab.0.bottom" timestamp="1717394781743">
<screen x="0" y="25" width="1920" height="982" />
</state>
<state width="1334" height="298" key="GridCell.Tab.0.bottom/0.25.1920.1055/1920.25.1920.982@0.25.1920.1055" timestamp="1715845500395" />
<state width="1334" height="292" key="GridCell.Tab.0.bottom/0.25.1920.982/1920.25.1920.1055@0.25.1920.982" timestamp="1717394781743" />
<state width="1334" height="292" key="GridCell.Tab.0.center" timestamp="1717394781743">
<screen x="0" y="25" width="1920" height="982" />
</state>
<state width="1334" height="298" key="GridCell.Tab.0.center/0.25.1920.1055/1920.25.1920.982@0.25.1920.1055" timestamp="1715845500395" />
<state width="1334" height="292" key="GridCell.Tab.0.center/0.25.1920.982/1920.25.1920.1055@0.25.1920.982" timestamp="1717394781743" />
<state width="1334" height="292" key="GridCell.Tab.0.left" timestamp="1717394781743">
<screen x="0" y="25" width="1920" height="982" />
</state>
<state width="1334" height="298" key="GridCell.Tab.0.left/0.25.1920.1055/1920.25.1920.982@0.25.1920.1055" timestamp="1715845500395" />
<state width="1334" height="292" key="GridCell.Tab.0.left/0.25.1920.982/1920.25.1920.1055@0.25.1920.982" timestamp="1717394781743" />
<state width="1334" height="292" key="GridCell.Tab.0.right" timestamp="1717394781743">
<screen x="0" y="25" width="1920" height="982" />
</state>
<state width="1334" height="298" key="GridCell.Tab.0.right/0.25.1920.1055/1920.25.1920.982@0.25.1920.1055" timestamp="1715845500395" />
<state width="1334" height="292" key="GridCell.Tab.0.right/0.25.1920.982/1920.25.1920.1055@0.25.1920.982" timestamp="1717394781743" />
<state x="548" y="251" width="824" height="534" key="IDE.errors.dialog" timestamp="1717661016042">
<screen x="0" y="25" width="1920" height="982" />
</state>
<state x="548" y="268" width="824" height="533" key="IDE.errors.dialog/0.25.1920.1055/1920.25.1920.982@0.25.1920.1055" timestamp="1717405855676" />
<state x="548" y="251" width="824" height="534" key="IDE.errors.dialog/0.25.1920.982/1920.25.1920.1055@0.25.1920.982" timestamp="1717661016042" />
<state x="1350" y="913" width="350" height="133" key="ProcessPopupWindow" timestamp="1715935852294">
<screen x="0" y="25" width="1920" height="1055" />
</state>
<state x="1350" y="913" width="350" height="133" key="ProcessPopupWindow/0.25.1920.1055/1920.25.1920.982@0.25.1920.1055" timestamp="1715935852294" />
<state x="469" y="158" key="SettingsEditor" timestamp="1717396831306">
<screen x="0" y="25" width="1920" height="982" />
</state>
<state x="469" y="158" key="SettingsEditor/0.25.1920.982/1920.25.1920.1055@0.25.1920.982" timestamp="1717396831306" />
</component>
<component name="editorHistoryManager">
<entry file="file://$PROJECT_DIR$/src/Abc.kt" />
<entry file="file://$PROJECT_DIR$/src/Main.kt">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="66">
<caret line="3" column="18" selection-start-line="3" selection-start-column="18" selection-end-line="3" selection-end-column="18" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/name1.ts">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="66">
<caret line="3" column="5" selection-start-line="3" selection-start-column="5" selection-end-line="3" selection-end-column="5" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/name.ts">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="88">
<caret line="4" column="24" selection-start-line="4" selection-start-column="24" selection-end-line="4" selection-end-column="24" />
</state>
</provider>
</entry>
<entry file="jar:///Library/Java/JavaVirtualMachines/graalvm-22.jdk/Contents/Home/lib/src.zip!/java.base/java/lang/Throwable.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="318">
<caret line="124" column="34" selection-start-line="124" selection-start-column="34" selection-end-line="124" selection-end-column="34" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/Main.java">
<provider selected="true" editor-type-id="text-editor">
<state>
<caret column="34" selection-start-column="34" selection-end-column="34" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main.slint">
<provider selected="true" editor-type-id="text-editor">
<state>
<caret line="2" column="21" selection-start-line="2" selection-start-column="21" selection-end-line="2" selection-end-column="21" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/builtins.slint">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="298">
<caret line="161" column="17" selection-start-line="161" selection-start-column="17" selection-end-line="161" selection-end-column="17" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/Button.slint">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="66">
<caret line="3" column="36" selection-end-line="18" selection-end-column="35" />
</state>
</provider>
</entry>
</component>
</project>

View File

@@ -0,0 +1,56 @@
<project version="4">
<component name="BookmarksManager">
<option name="groups">
<GroupState>
<option name="name" value="intellij-test" />
</GroupState>
</option>
</component>
<component name="ProjectView">
<navigator currentView="ProjectPane" proportions="" version="1" />
<panes>
<pane id="PackagesPane" />
<pane id="ProjectPane">
<subPane>
<expand>
<path>
<item name="intellij-test" type="b2602c69:ProjectViewProjectNode" />
<item name="dir{file:///Users/me/Desktop/Dev/垃圾桶/intellij-test/intellij-test}" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="intellij-test" type="b2602c69:ProjectViewProjectNode" />
<item name="dir{file:///Users/me/Desktop/Dev/垃圾桶/intellij-test/intellij-test}" type="462c0819:PsiDirectoryNode" />
<item name="dir{file:///Users/me/Desktop/Dev/垃圾桶/intellij-test/intellij-test/.idea}" type="462c0819:PsiDirectoryNode" />
</path>
</expand>
<select />
</subPane>
</pane>
<pane id="Scope" />
</panes>
</component>
<component name="TimeTrackingManager">
<option name="totallyTimeSpent" value="1082000" />
</component>
<component name="ToolWindowManager">
<layoutV2>
<window_info active="true" content_ui="combo" id="Project" order="0" visible="true" weight="0.33035713" />
<window_info id="Commit" order="1" weight="0.25" />
<window_info id="Structure" order="2" side_tool="true" weight="0.25" />
<window_info anchor="bottom" id="Version Control" order="0" />
<window_info anchor="bottom" id="Problems" order="1" />
<window_info anchor="bottom" id="Problems View" order="2" />
<window_info anchor="bottom" id="Terminal" order="3" />
<window_info anchor="bottom" id="Services" order="4" />
<window_info anchor="right" content_ui="combo" id="Notifications" order="0" weight="0.25" />
<window_info anchor="right" id="AIAssistant" order="1" weight="0.25" />
<window_info anchor="right" id="Database" order="2" weight="0.25" />
<window_info anchor="right" id="Gradle" order="3" weight="0.25" />
<window_info anchor="right" id="Maven" order="4" weight="0.25" />
<unified_weights left="0.33035713" />
</layoutV2>
<recentWindows>
<value>Project</value>
</recentWindows>
</component>
</project>

View File

@@ -0,0 +1,7 @@
2024-06-03 17:44:03,869 [ 121] INFO - #c.i.p.d.t.TelemetryManager - Loaded telemetry tracer service com.intellij.platform.diagnostic.telemetry.impl.TelemetryManagerImpl
2024-06-03 17:44:35,087 [ 129] INFO - #c.i.p.d.t.TelemetryManager - Loaded telemetry tracer service com.intellij.platform.diagnostic.telemetry.impl.TelemetryManagerImpl
2024-06-03 17:45:37,074 [ 99] INFO - #c.i.p.d.t.TelemetryManager - Loaded telemetry tracer service com.intellij.platform.diagnostic.telemetry.impl.TelemetryManagerImpl
2024-06-03 18:20:08,328 [ 159] INFO - #c.i.p.d.t.TelemetryManager - Loaded telemetry tracer service com.intellij.platform.diagnostic.telemetry.impl.TelemetryManagerImpl
2024-06-03 18:21:25,456 [ 96] INFO - #c.i.p.d.t.TelemetryManager - Loaded telemetry tracer service com.intellij.platform.diagnostic.telemetry.impl.TelemetryManagerImpl
2024-08-20 14:26:47,297 [ 141] INFO - #c.i.p.d.t.TelemetryManager - Loaded telemetry tracer service com.intellij.platform.diagnostic.telemetry.impl.TelemetryManagerImpl
2024-08-20 14:27:15,693 [ 92] INFO - #c.i.p.d.t.TelemetryManager - Loaded telemetry tracer service com.intellij.platform.diagnostic.telemetry.impl.TelemetryManagerImpl

View File

@@ -1,16 +1,13 @@
package me.zhouxi.slint.icons
import com.intellij.ui.IconManager
import com.intellij.openapi.util.IconLoader
import javax.swing.Icon
object SlintIcons {
private fun load(path: String, cacheKey: Int, flags: Int): Icon {
return IconManager.getInstance()
.loadRasterizedIcon(path, SlintIcons::class.java.classLoader, cacheKey, flags)
}
val Primary: Icon = load("icons/slint-logo-small-light.png", 199921742, 2)
/**
* Primary icon - used in various UI contexts
* Alias for FileType for backward compatibility
*/
@JvmField
val Primary: Icon = IconLoader.getIcon("/icons/slint.svg", SlintIcons::class.java)
}

View File

@@ -0,0 +1,15 @@
package me.zhouxi.slint.lang
import com.intellij.openapi.fileTypes.LanguageFileType
import me.zhouxi.slint.icons.SlintIcons
import javax.swing.Icon
object SlintFileType : LanguageFileType(SlintLanguage) {
override fun getName(): String = "Slint"
override fun getDescription(): String = "Slint UI file"
override fun getDefaultExtension(): String = "slint"
override fun getIcon(): Icon = SlintIcons.Primary
}

View File

@@ -0,0 +1,7 @@
package me.zhouxi.slint.lang
import com.intellij.lang.Language
object SlintLanguage : Language("Slint") {
override fun getDisplayName(): String = "Slint"
}

View File

@@ -0,0 +1,18 @@
package me.zhouxi.slint.lang.syntax
import org.jetbrains.plugins.textmate.api.TextMateBundleProvider
import java.nio.file.Path
class SlintTextMateProvider : TextMateBundleProvider {
override fun getBundles(): List<TextMateBundleProvider.PluginBundle> {
val resource = SlintTextMateProvider::class.java.classLoader.getResource("textmate/slint.tmLanguage.json")
?: throw IllegalStateException("Could not find Slint TextMate grammar file")
return listOf(
TextMateBundleProvider.PluginBundle(
"Slint",
Path.of(resource.toURI())
)
)
}
}

View File

@@ -9,6 +9,7 @@ import com.intellij.platform.lsp.api.ProjectWideLspServerDescriptor
import com.intellij.platform.lsp.api.lsWidget.LspServerWidgetItem
import me.zhouxi.slint.SlintRuntime
import me.zhouxi.slint.icons.SlintIcons
import me.zhouxi.slint.lang.SlintFileType
class SlintLspServerSupportProvider : LspServerSupportProvider {
override fun fileOpened(
@@ -16,8 +17,8 @@ class SlintLspServerSupportProvider : LspServerSupportProvider {
file: VirtualFile,
serverStarter: LspServerSupportProvider.LspServerStarter
) {
if (file.extension == "slint") {
serverStarter.ensureServerStarted(FooLspServerDescriptor(project))
if (file.fileType == SlintFileType) {
serverStarter.ensureServerStarted(SlintLspServerDescriptor(project))
}
}
@@ -31,8 +32,8 @@ class SlintLspServerSupportProvider : LspServerSupportProvider {
SlintIcons.Primary,
)
private class FooLspServerDescriptor(project: Project) : ProjectWideLspServerDescriptor(project, "Slint") {
override fun isSupportedFile(file: VirtualFile) = file.extension == "slint"
private class SlintLspServerDescriptor(project: Project) : ProjectWideLspServerDescriptor(project, "Slint") {
override fun isSupportedFile(file: VirtualFile) = file.fileType == SlintFileType
override fun createCommandLine(): GeneralCommandLine {
val line = GeneralCommandLine(SlintRuntime.LspExecutable.toAbsolutePath().toString())

View File

@@ -14,6 +14,13 @@
<!-- Extensions defined by the plugin.
Read more: https://plugins.jetbrains.com/docs/intellij/plugin-extension-points.html -->
<extensions defaultExtensionNs="com.intellij">
<fileType
name="Slint"
implementationClass="me.zhouxi.slint.lang.SlintFileType"
fieldName="INSTANCE"
language="Slint"
extensions="slint"/>
<platform.lsp.serverSupportProvider implementation="me.zhouxi.slint.lsp.SlintLspServerSupportProvider"/>
<!-- <textMate.bundleProvider implementation="me.zhouxi.slint.lang.syntax.SlintTextMateProvider"/>-->
</extensions>
</idea-plugin>

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 12 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 12 KiB

Some files were not shown because too many files have changed in this diff Show More