Skip to content

Commit 27b829a

Browse files
authored
prevent new language adapter instances being created on keypress (#6459)
## 📝 Summary <!-- Provide a concise summary of what this pull request is addressing. If this PR fixes any issues, list them here by number (e.g., Fixes #123). --> Previously new adapters were created on every keystroke, this only triggers the initialization once. We have to use getters for circular deps issues. ## 🔍 Description of Changes <!-- Detail the specific changes made in this pull request. Explain the problem addressed and how it was resolved. If applicable, provide before and after comparisons, screenshots, or any relevant details to help reviewers understand the changes easily. --> ## 📋 Checklist - [x] I have read the [contributor guidelines](https://github.com/marimo-team/marimo/blob/main/CONTRIBUTING.md). - [ ] For large changes, or changes that affect the public API: this change was discussed or approved through an issue, on [Discord](https://marimo.io/discord?ref=pr), or the community [discussions](https://github.com/marimo-team/marimo/discussions) (Please provide a link if applicable). - [ ] I have added tests for the changes made. - [x] I have run the code and verified that it works as expected.
1 parent f284800 commit 27b829a

File tree

4 files changed

+18
-15
lines changed

4 files changed

+18
-15
lines changed

frontend/src/components/editor/cell/CreateCellButton.tsx

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,7 @@ import {
99
} from "@/components/ui/context-menu";
1010
import { maybeAddMarimoImport } from "@/core/cells/add-missing-import";
1111
import { useCellActions } from "@/core/cells/cells";
12-
import { MarkdownLanguageAdapter } from "@/core/codemirror/language/languages/markdown";
13-
import { SQLLanguageAdapter } from "@/core/codemirror/language/languages/sql/sql";
12+
import { LanguageAdapters } from "@/core/codemirror/language/LanguageAdapters";
1413
import {
1514
getConnectionTooltip,
1615
isAppInteractionDisabled,
@@ -103,7 +102,7 @@ const CreateCellButtonContextMenu = (props: {
103102
evt.stopPropagation();
104103
maybeAddMarimoImport({ autoInstantiate: true, createNewCell });
105104
onClick({
106-
code: new MarkdownLanguageAdapter().defaultCode,
105+
code: LanguageAdapters.markdown.defaultCode,
107106
hideCode: true,
108107
});
109108
}}
@@ -118,7 +117,7 @@ const CreateCellButtonContextMenu = (props: {
118117
onSelect={(evt) => {
119118
evt.stopPropagation();
120119
maybeAddMarimoImport({ autoInstantiate: true, createNewCell });
121-
onClick({ code: new SQLLanguageAdapter().defaultCode });
120+
onClick({ code: LanguageAdapters.sql.defaultCode });
122121
}}
123122
>
124123
<div className="mr-3 text-muted-foreground">

frontend/src/components/editor/cell/code/language-toggle.tsx

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,7 @@ import { useMemo } from "react";
77
import { Button } from "@/components/ui/button";
88
import { Tooltip } from "@/components/ui/tooltip";
99
import { switchLanguage } from "@/core/codemirror/language/extension";
10-
import { MarkdownLanguageAdapter } from "@/core/codemirror/language/languages/markdown";
11-
import { SQLLanguageAdapter } from "@/core/codemirror/language/languages/sql/sql";
10+
import { LanguageAdapters } from "@/core/codemirror/language/LanguageAdapters";
1211
import type { LanguageAdapter } from "@/core/codemirror/language/types";
1312
import { Functions } from "@/utils/functions";
1413
import { MarkdownIcon, PythonIcon } from "./icons";
@@ -27,11 +26,11 @@ export const LanguageToggles: React.FC<LanguageTogglesProps> = ({
2726
onAfterToggle,
2827
}) => {
2928
const canUseMarkdown = useMemo(
30-
() => new MarkdownLanguageAdapter().isSupported(code) || code.trim() === "",
29+
() => LanguageAdapters.markdown.isSupported(code) || code.trim() === "",
3130
[code],
3231
);
3332
const canUseSQL = useMemo(
34-
() => new SQLLanguageAdapter().isSupported(code) || code.trim() === "",
33+
() => LanguageAdapters.sql.isSupported(code) || code.trim() === "",
3534
[code],
3635
);
3736

frontend/src/components/editor/renderers/CellArray.tsx

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,7 @@ import { SortableCellsProvider } from "@/components/sort/SortableCellsProvider";
2020
import { Button } from "@/components/ui/button";
2121
import { Tooltip } from "@/components/ui/tooltip";
2222
import { maybeAddMarimoImport } from "@/core/cells/add-missing-import";
23-
import { MarkdownLanguageAdapter } from "@/core/codemirror/language/languages/markdown";
24-
import { SQLLanguageAdapter } from "@/core/codemirror/language/languages/sql/sql";
23+
import { LanguageAdapters } from "@/core/codemirror/language/LanguageAdapters";
2524
import { aiEnabledAtom } from "@/core/config/config";
2625
import { isConnectedAtom } from "@/core/network/connection";
2726
import { useBoolean } from "@/hooks/useBoolean";
@@ -288,7 +287,7 @@ const AddCellButtons: React.FC<{
288287
createNewCell({
289288
cellId: { type: "__end__", columnId },
290289
before: false,
291-
code: new MarkdownLanguageAdapter().defaultCode,
290+
code: LanguageAdapters.markdown.defaultCode,
292291
hideCode: true,
293292
});
294293
}}
@@ -307,7 +306,7 @@ const AddCellButtons: React.FC<{
307306
createNewCell({
308307
cellId: { type: "__end__", columnId },
309308
before: false,
310-
code: new SQLLanguageAdapter().defaultCode,
309+
code: LanguageAdapters.sql.defaultCode,
311310
});
312311
}}
313312
>

frontend/src/core/codemirror/language/LanguageAdapters.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,26 @@
11
/* Copyright 2024 Marimo. All rights reserved. */
22

3+
import { once } from "@/utils/once";
34
import { MarkdownLanguageAdapter } from "./languages/markdown";
45
import { PythonLanguageAdapter } from "./languages/python";
56
import { SQLLanguageAdapter } from "./languages/sql/sql";
67
import type { LanguageAdapter, LanguageAdapterType } from "./types";
78

9+
// Create cached instances
10+
const createPythonAdapter = once(() => new PythonLanguageAdapter());
11+
const createMarkdownAdapter = once(() => new MarkdownLanguageAdapter());
12+
const createSqlAdapter = once(() => new SQLLanguageAdapter());
13+
814
export const LanguageAdapters: Record<LanguageAdapterType, LanguageAdapter> = {
915
// Getters to prevent circular dependencies
1016
get python() {
11-
return new PythonLanguageAdapter();
17+
return createPythonAdapter();
1218
},
1319
get markdown() {
14-
return new MarkdownLanguageAdapter();
20+
return createMarkdownAdapter();
1521
},
1622
get sql() {
17-
return new SQLLanguageAdapter();
23+
return createSqlAdapter();
1824
},
1925
};
2026

0 commit comments

Comments
 (0)