Skip to content

Commit 1e5d545

Browse files
committed
Fix JSON error gutter markers in flet_code_editor
1 parent 48e1ee7 commit 1e5d545

File tree

4 files changed

+97
-13
lines changed

4 files changed

+97
-13
lines changed

client/pubspec.lock

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -359,7 +359,7 @@ packages:
359359
path: "../packages/flet"
360360
relative: true
361361
source: path
362-
version: "0.83.0"
362+
version: "0.83.1"
363363
flet_ads:
364364
dependency: "direct main"
365365
description:
@@ -911,10 +911,10 @@ packages:
911911
dependency: transitive
912912
description:
913913
name: matcher
914-
sha256: "12956d0ad8390bbcc63ca2e1469c0619946ccb52809807067a7020d57e647aa6"
914+
sha256: dc0b7dc7651697ea4ff3e69ef44b0407ea32c487a39fff6a4004fa585e901861
915915
url: "https://pub.dev"
916916
source: hosted
917-
version: "0.12.18"
917+
version: "0.12.19"
918918
material_color_utilities:
919919
dependency: transitive
920920
description:
@@ -1628,10 +1628,10 @@ packages:
16281628
dependency: transitive
16291629
description:
16301630
name: test_api
1631-
sha256: "93167629bfc610f71560ab9312acdda4959de4df6fac7492c89ff0d3886f6636"
1631+
sha256: "8161c84903fd860b26bfdefb7963b3f0b68fee7adea0f59ef805ecca346f0c7a"
16321632
url: "https://pub.dev"
16331633
source: hosted
1634-
version: "0.7.9"
1634+
version: "0.7.10"
16351635
torch_light:
16361636
dependency: transitive
16371637
description:

sdk/python/packages/flet-code-editor/src/flutter/flet_code_editor/lib/src/utils/flet_code_controller.dart

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,21 @@
11
import 'package:flutter/widgets.dart';
22
import 'package:flutter_code_editor/flutter_code_editor.dart' as fce;
3+
import 'package:highlight/languages/json.dart';
4+
5+
import 'json_analyzer.dart';
36

47
class FletCodeController extends fce.CodeController {
5-
FletCodeController({
6-
super.text,
7-
super.language,
8-
});
8+
FletCodeController({super.text, super.language})
9+
: super(analyzer: _analyzerForLanguage(language));
910

1011
bool autocompletionEnabled = false;
1112

13+
static fce.AbstractAnalyzer _analyzerForLanguage(dynamic language) {
14+
return language != json
15+
? const fce.DefaultLocalAnalyzer()
16+
: const JsonLocalAnalyzer();
17+
}
18+
1219
@override
1320
Future<void> generateSuggestions() async {
1421
if (!autocompletionEnabled) {
@@ -44,10 +51,7 @@ class FletCodeController extends fce.CodeController {
4451
extentOffset: endSelectionPosition,
4552
);
4653

47-
value = TextEditingValue(
48-
text: replacedText,
49-
selection: adjustedSelection,
50-
);
54+
value = TextEditingValue(text: replacedText, selection: adjustedSelection);
5155

5256
popupController.hide();
5357
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import 'dart:convert';
2+
3+
import 'package:flutter_code_editor/flutter_code_editor.dart' as fce;
4+
5+
class JsonLocalAnalyzer extends fce.AbstractAnalyzer {
6+
const JsonLocalAnalyzer();
7+
8+
static const _defaultAnalyzer = fce.DefaultLocalAnalyzer();
9+
10+
@override
11+
Future<fce.AnalysisResult> analyze(fce.Code code) async {
12+
final issues = (await _defaultAnalyzer.analyze(code)).issues.toList();
13+
14+
if (code.text.trim().isEmpty) {
15+
return fce.AnalysisResult(issues: issues);
16+
}
17+
18+
try {
19+
jsonDecode(code.text);
20+
} on FormatException catch (error) {
21+
issues.add(
22+
fce.Issue(
23+
line: _lineFromOffset(code.text, error.offset),
24+
message: error.message,
25+
type: fce.IssueType.error,
26+
),
27+
);
28+
}
29+
30+
return fce.AnalysisResult(issues: issues);
31+
}
32+
33+
int _lineFromOffset(String text, int? offset) {
34+
final safeOffset = (offset ?? 0).clamp(0, text.length);
35+
return '\n'.allMatches(text.substring(0, safeOffset)).length;
36+
}
37+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import 'package:flutter_code_editor/flutter_code_editor.dart' as fce;
2+
import 'package:flutter_test/flutter_test.dart';
3+
import 'package:highlight/languages/json.dart';
4+
5+
import 'package:flet_code_editor/src/utils/flet_code_controller.dart';
6+
import 'package:flet_code_editor/src/utils/json_analyzer.dart';
7+
8+
void main() {
9+
group('FletCodeController JSON analyzer', () {
10+
test('uses JSON analyzer for JSON language', () {
11+
final controller = FletCodeController(
12+
text: '{"name": "flet"}',
13+
language: json,
14+
);
15+
16+
expect(controller.analyzer, isA<JsonLocalAnalyzer>());
17+
});
18+
19+
test('reports invalid JSON syntax as gutter issues', () async {
20+
final controller = FletCodeController(
21+
text: '{\n "name": "flet"\n "version": 1\n}',
22+
language: json,
23+
);
24+
25+
await controller.analyzeCode();
26+
27+
expect(controller.analysisResult.issues, hasLength(1));
28+
expect(controller.analysisResult.issues.single.line, 2);
29+
expect(controller.analysisResult.issues.single.type, fce.IssueType.error);
30+
});
31+
32+
test('keeps valid JSON free of issues', () async {
33+
final controller = FletCodeController(
34+
text: '{\n "name": "flet",\n "version": 1\n}',
35+
language: json,
36+
);
37+
38+
await controller.analyzeCode();
39+
40+
expect(controller.analysisResult.issues, isEmpty);
41+
});
42+
});
43+
}

0 commit comments

Comments
 (0)