Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
dc2db7f
fix: Non-ASCII test names being escaped when creating run configurati…
chika3742 Mar 23, 2026
66bcb11
Fix reported freeze (#8864)
helin24 Mar 23, 2026
f98a22a
[build] inline dev-build upload in `deploy.sh` (#8868)
pq Mar 25, 2026
dd0088d
Update sunsetted Flutter SDK versions (#8874)
helin24 Mar 31, 2026
76d8e58
Add reflection utility to fix split debugger error (#8878)
helin24 Apr 1, 2026
b0d959e
Add missing changelog entries and update version (#8880)
helin24 Apr 1, 2026
e5c96f8
Revert "Fix IntelliJ IDEA project open hang by removing FlutterProjec…
helin24 Apr 2, 2026
c57eba9
Use PR numbers in changelog, not issue numbers (#8881)
helin24 Apr 2, 2026
2352bc0
Update Dart plugin version (#8886)
helin24 Apr 2, 2026
27965c3
[fix] target device selector updates (#8891)
pq Apr 8, 2026
cb14614
[ai] add `.aiconfig` (#8894)
pq Apr 9, 2026
e965bb8
Fix IDEA project open hang (#8903)
helin24 Apr 16, 2026
a105e50
Fix losing focus in full screen mode (#8906)
helin24 Apr 16, 2026
662daed
feat: Add file chooser support for widget preview initialization. (#8…
nopjar Apr 16, 2026
5e47de6
[ai] add Claude config (#8912)
pq Apr 17, 2026
c471478
[docs] stop specifying a JDK version (#8911)
pq Apr 17, 2026
70da7a0
[infra] add parameterized `runTarget` to allow running against custom…
pq Apr 17, 2026
6d04cb3
[friction] add auto-baseline updating (#8917)
pq Apr 20, 2026
f47490f
[infra] include Android Studio in release printing (#8915)
cj-radcliff Apr 21, 2026
afc33b5
remove stale link (#8920)
pq Apr 23, 2026
5ba28ee
Bump actions/upload-artifact from 6 to 7 (#8841)
dependabot[bot] Apr 24, 2026
44c3709
[maintenance] migrate deps to `libs.versions.toml` (#8923)
pq Apr 24, 2026
a339482
[maintenance] add gradle deps to dependabot tracking (#8924)
pq Apr 24, 2026
50e466b
Bump gradle-wrapper from 9.3.0 to 9.4.1 (#8926)
dependabot[bot] Apr 24, 2026
336680f
Bump org.jetbrains.changelog from 2.2.0 to 2.5.0 (#8930)
dependabot[bot] Apr 24, 2026
335dd2b
Bump org.junit.platform:junit-platform-launcher from 1.11.4 to 6.0.3 …
dependabot[bot] Apr 24, 2026
57a24ca
Bump com.google.guava:guava from 32.0.1-android to 33.6.0-android (#8…
dependabot[bot] Apr 24, 2026
f2bdbff
Bump org.junit.jupiter:junit-jupiter from 5.11.4 to 6.0.3 (#8927)
dependabot[bot] Apr 24, 2026
739933c
[docs] changelog update for 92.0.0 (#8931)
pq Apr 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions .aiconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Gemini Code Assist Configuration
version: 1.0
project:
context:
instruction_files:
- .gemini/styleguide.md

generation_rules:
- "Strictly adhere to the IntelliJ Platform Threading Model: No I/O on the EDT."
- "All generated AnAction classes must be stateless."
- "Apply [MUST-FIX], [CONCERN], and [NIT] severity logic to any code suggestions that violate plugin SDK best practices or style guidelines."
- "Use io.flutter.logging.PluginLogger for all logging; avoid System.out."
- "Always include the standard Chromium Authors copyright header in new files."
- "Adhere to the Zero-Formatting Policy: Do not comment on indentation, spacing, or brace placement."
# Ensure local agents read styleguide files automatically.
- "At the start of the session, read and adhere to the guidelines in all files listed in project.context.instruction_files."

languages:
- java
- kotlin
- dart
8 changes: 6 additions & 2 deletions .gemini/styleguide.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ enforce standard modern Java/Kotlin coding conventions, but strictly police the
- `[NIT]`: Idiomatic improvements or minor naming suggestions.
- **Focus:** Prioritize logic, performance on the UI thread, and architectural consistency.
- **No Empty Praise:** Do not leave "Looks good" or "Nice change" comments. If there are no issues, leave no comments.
- **Copyright Headers:** Ensure all new files have a proper copyright header (e.g., `Copyright 2026 The Chromium Authors`). Flag any missing
headers as `[MUST-FIX]`.

## 2. IntelliJ Platform Best Practices

Expand All @@ -30,8 +32,10 @@ enforce standard modern Java/Kotlin coding conventions, but strictly police the
as recommended by the modern SDK.
- **Backward Compatibility:** Avoid using `@ApiStatus.Internal` or `@ApiStatus.ScheduledForRemoval` APIs unless strictly necessary.
- **Logging:**
- Reject any use of `System.out.println` or `System.err.println` for logging in `src/` code (integration tests may use them for milestone logging).
- Enforce the use of the IntelliJ SDK's built-in logger (`com.intellij.openapi.diagnostic.Logger`) or our own (`io.flutter.logging.PluginLogger`).
- Reject any use of `System.out.println` or `System.err.println` for logging in `src/` code (integration tests may use them for
milestone logging).
- Enforce the use of the IntelliJ SDK's built-in logger (`com.intellij.openapi.diagnostic.Logger`) or our own (
`io.flutter.logging.PluginLogger`).
- **Actions:**
- Classes extending `AnAction` must be completely stateless. Flag any `AnAction` class that defines mutable instance variables (fields),
as the platform instantiates a single instance of the action for the lifetime of the IDE.
Expand Down
10 changes: 7 additions & 3 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,3 @@
# See Dependabot documentation for all configuration options:
# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates

version: 2
updates:
- package-ecosystem: "github-actions"
Expand All @@ -14,3 +11,10 @@ updates:
ignore:
- dependency-name: "*"
update-types: ["version-update:semver-patch"]

- package-ecosystem: "gradle"
directory: "/"
schedule:
interval: "weekly"
labels:
- "autosubmit"
2 changes: 1 addition & 1 deletion .github/workflows/presubmit.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ jobs:
env:
BOT: ${{ matrix.bot }}
- name: upload build artifacts
uses: actions/upload-artifact@v6
uses: actions/upload-artifact@v7
if: always()
with:
name: build-${{ matrix.bot }}
Expand Down
2 changes: 2 additions & 0 deletions AUTHORS
Original file line number Diff line number Diff line change
Expand Up @@ -26,3 +26,5 @@ Mohamed El Sayed <devblooming@tutanota.com>
Edwin Ludik <edwin.ludik@gmail.com>
Japnit Singh <truejswalia@gmail.com>
Dmitry Kandalov <dmitry.kandalov@gmail.com>
Kazuya Chikamatsu <kazu.chika.shima@gmail.com>
Dustin Feucht <code.nopjar@gmail.com>
21 changes: 18 additions & 3 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,30 @@

### Added

### Changed
- Option to specify the pub root module for Flutter Widget Previewer. (#8888)

- Updated gradle plugin version to re-enable running `./gradlew verifyPlugin` locally. (#8847)
### Changed

### Removed

### Fixed
- Silent failure when opening Flutter projects without `.idea` directory in IntelliJ IDEA, by removing `FlutterProjectOpenProcessor` and
migrating configuration logic to `FlutterInitializer`. (#8903)
- IDE focus loss when running in full screen mode. (#8906)
- Excessive toolbar updates causing exceptions in Android Studio, by making device selector updates targeted instead of global. (#8891)

## 91.0.0

### Changed

- Gradle plugin version to re-enable running `./gradlew verifyPlugin` locally. (#8847)

### Fixed

- Silent failure when opening Flutter projects without `.idea` directory in IntelliJ IDEA, by removing `FlutterProjectOpenProcessor` and migrating configuration logic to `FlutterInitializer`. (#8845)
- Gutter buttons not running tests with non-ASCII characters in their names. (#8838)
- Freeze from JX Browser close. (#8864)
- Crash in split debugger mode in IntelliJ 2025.3+. (#8878)
- Passing additional arguments from the Flutter test template. (#8836)

## 90.0.0

Expand Down
12 changes: 12 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# Flutter IntelliJ Plugin — Claude Code Guide

@.gemini/styleguide.md

## Additional Rules

- No I/O or heavy computation on the EDT (IntelliJ Threading Model).
- All `AnAction` subclasses must be stateless (no mutable instance fields).
- Use `io.flutter.logging.PluginLogger` (or IntelliJ's `Logger`) for all logging; never `System.out`.
- All new files must include the standard Chromium Authors copyright header.
- Zero-Formatting Policy: do not comment on indentation, spacing, or brace placement.
- Categorize code suggestions with `[MUST-FIX]`, `[CONCERN]`, or `[NIT]` severity prefixes.
18 changes: 17 additions & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,6 @@ name and contact info to the [AUTHORS](AUTHORS) file.
## Environment set-up

1. Install the latest [Java Development Kit](https://www.java.com/en/download/).
- The current Java Development Kit version is: **23**.
- **[Googlers only]** Install Java from go/softwarecenter instead.

2. Set your `JAVA_HOME` directory in the configuration file for your shell environment.
Expand Down Expand Up @@ -233,6 +232,23 @@ name and contact info to the [AUTHORS](AUTHORS) file.
- Expand `Edit configuration templates...` and verify that Flutter is present.
- Click [+] and verify that Flutter is present.

### Running against custom target IDEs

To test or debug the plugin against a different IDE target (like IntelliJ IDEA Community or Ultimate) without changing the project's compilation target, you can use the custom `runTarget` Gradle task.

Run it from the command line specifying the target IDE and version:
```bash
./gradlew runTarget -Pide=IntelliJ -PideV=2025.1
```

* **`-Pide`**: Valid values are `AndroidStudio` (default), `IntelliJ` (Community), and `Ultimate`.
* **`-PideV`**: Any valid version string or build number for the selected IDE.

To see a full list of available options and usage examples, run the task without any parameters:
```bash
./gradlew runTarget
```

## Provision Tool

This is not currently required. However, for debugging unit tests, it may be handy; please ignore for now.
Expand Down
89 changes: 72 additions & 17 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -40,10 +40,10 @@ plugins {
// https://plugins.gradle.org/plugin/org.jetbrains.intellij.platform
// https://plugins.gradle.org/plugin/org.jetbrains.kotlin.jvm
id("java") // Java support
id("org.jetbrains.intellij.platform") version "2.12.0" // IntelliJ Platform Gradle Plugin
id("org.jetbrains.kotlin.jvm") version "2.2.0" // Kotlin support
id("org.jetbrains.changelog") version "2.2.0" // Gradle Changelog Plugin
id("org.jetbrains.kotlinx.kover") version "0.9.4"
alias(libs.plugins.intellij.platform) // IntelliJ Platform Gradle Plugin
alias(libs.plugins.kotlin.jvm) // Kotlin support
alias(libs.plugins.changelog) // Gradle Changelog Plugin
alias(libs.plugins.kover)
idea // IntelliJ IDEA support
}

Expand Down Expand Up @@ -239,13 +239,13 @@ dependencies {
pluginVerifier()
}

compileOnly("org.jetbrains:annotations:24.0.0")
testImplementation("org.jetbrains:annotations:24.0.0")
compileOnly("com.google.guava:guava:32.0.1-android")
compileOnly("com.google.code.gson:gson:2.10.1")
testImplementation("com.google.guava:guava:32.0.1-jre")
testImplementation("com.google.code.gson:gson:2.10.1")
testImplementation("junit:junit:4.13.2")
compileOnly(libs.jetbrains.annotations)
testImplementation(libs.jetbrains.annotations)
compileOnly(libs.guava.android)
compileOnly(libs.gson)
testImplementation(libs.guava.jre)
testImplementation(libs.gson)
testImplementation(libs.junit)
implementation(
fileTree(
mapOf(
Expand All @@ -256,12 +256,12 @@ dependencies {
)

// UI Test dependencies
integrationImplementation("org.kodein.di:kodein-di-jvm:7.26.1")
integrationImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0")
integrationImplementation(libs.kodein.di)
integrationImplementation(libs.kotlinx.coroutines)

// JUnit 5 is required for UI tests
integrationImplementation("org.junit.jupiter:junit-jupiter:5.11.4")
integrationRuntimeOnly("org.junit.platform:junit-platform-launcher")
integrationImplementation(libs.junit.jupiter)
integrationRuntimeOnly(libs.junit.platform.launcher)
}

intellijPlatform {
Expand Down Expand Up @@ -389,12 +389,20 @@ tasks {
// https://plugins.jetbrains.com/docs/intellij/tools-intellij-platform-gradle-plugin-faq.html#how-to-check-the-latest-available-eap-release
tasks {
printProductsReleases {
channels = listOf(ProductRelease.Channel.EAP)
types = listOf(IntelliJPlatformType.IntellijIdeaCommunity)
channels = listOf(ProductRelease.Channel.RELEASE, ProductRelease.Channel.EAP)
types = listOf(IntelliJPlatformType.IntellijIdeaCommunity, IntelliJPlatformType.IntellijIdeaUltimate, IntelliJPlatformType.AndroidStudio)
untilBuild = provider { null }

doLast {
productsReleases.get().max()
println()
println("Mapping printProductsReleases output to ideV:")
println(" - The prefix (e.g., IU-, IC-, AI-) maps to -Pide (Ultimate, IntelliJ, Android Studio).")
println(" - The number part (e.g., 261.23567.71) maps to -PideV.")
println(" - Example: IU-261.23567.71 -> -Pide=Ultimate -PideV=261.23567.71")
println(" - Example: AI-2025.3.3.6 -> -Pide=AndroidStudio -PideV=2025.3.3.6")

println()
}
}
prepareJarSearchableOptions {
Expand All @@ -415,6 +423,53 @@ tasks {
}
}

intellijPlatformTesting {
runIde {
register("runTarget") {
val target = project.findProperty("ide") as? String
val version = project.findProperty("ideV") as? String

val actualTarget = target ?: "AndroidStudio"
type = when (actualTarget) {
"IntelliJ" -> IntelliJPlatformType.IntellijIdeaCommunity
"Ultimate" -> IntelliJPlatformType.IntellijIdeaUltimate
else -> IntelliJPlatformType.AndroidStudio
}
this.version = version ?: ideaVersion
}
}
}

tasks.named("runTarget") {
val target = project.findProperty("ide") as? String
val version = project.findProperty("ideV") as? String

doFirst {
if (target == null && version == null) {
println("============================================================")
println("runTarget - Available Options")
println("============================================================")
println("Valid values for -Pide:")
println(" - AndroidStudio (default)")
println(" - IntelliJ (IntelliJ IDEA Community)")
println(" - Ultimate (IntelliJ IDEA Ultimate)")
println()
println("Valid values for -PideV:")
println(" - Any valid version string for the selected IDE.")
println(" - Examples for IntelliJ/Ultimate: 2024.1, 2024.2, 2024.3, 2025.1")
println(" - Run './gradlew printProductsReleases' to see the full list.")
println()
println("Examples:")
println(" ./gradlew runTarget -Pide=IntelliJ -PideV=2025.1")
println(" ./gradlew runTarget -Pide=Ultimate -PideV=2025.1")
println("============================================================")
println("Stopping execution. Please run with parameters to launch a specific IDE.")

throw org.gradle.api.tasks.StopExecutionException()
}
}
}

// A task to print the classpath used for compiling an IntelliJ plugin
// Run with `./gradlew printCompileClasspath --no-configuration-cache `
tasks.register<Task>("printCompileClasspath") {
Expand Down
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
#

ideaVersion=2025.2.3.9
dartPluginVersion= 503.0.0
dartPluginVersion= 504.0.0
# Also update the versions for verify checks in tool/github.sh.
sinceBuild=251
untilBuild=261.*
Expand Down
35 changes: 35 additions & 0 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# Copyright 2026 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

[versions]
jetbrains-annotations = "24.0.0"
guava-android = "33.6.0-android"
guava-jre = "33.6.0-android"
gson = "2.10.1"
junit = "4.13.2"
kodein-di = "7.26.1"
kotlinx-coroutines = "1.9.0"
junit-jupiter = "6.0.3"
junit-platform = "6.0.3"
intellij-platform-plugin = "2.12.0"
kotlin = "2.2.0"
changelog = "2.5.0"
kover = "0.9.4"

[libraries]
jetbrains-annotations = { group = "org.jetbrains", name = "annotations", version.ref = "jetbrains-annotations" }
guava-android = { group = "com.google.guava", name = "guava", version.ref = "guava-android" }
guava-jre = { group = "com.google.guava", name = "guava", version.ref = "guava-jre" }
gson = { group = "com.google.code.gson", name = "gson", version.ref = "gson" }
junit = { group = "junit", name = "junit", version.ref = "junit" }
kodein-di = { group = "org.kodein.di", name = "kodein-di-jvm", version.ref = "kodein-di" }
kotlinx-coroutines = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-core", version.ref = "kotlinx-coroutines" }
junit-jupiter = { group = "org.junit.jupiter", name = "junit-jupiter", version.ref = "junit-jupiter" }
junit-platform-launcher = { group = "org.junit.platform", name = "junit-platform-launcher", version.ref = "junit-platform" }

[plugins]
intellij-platform = { id = "org.jetbrains.intellij.platform", version.ref = "intellij-platform-plugin" }
kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" }
changelog = { id = "org.jetbrains.changelog", version.ref = "changelog" }
kover = { id = "org.jetbrains.kotlinx.kover", version.ref = "kover" }
Binary file modified gradle/wrapper/gradle-wrapper.jar
Binary file not shown.
2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.0-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.1-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
Expand Down
9 changes: 3 additions & 6 deletions gradlew

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading